事务:
要么都成功,要么都失败;
ACID原则:保证数据的安全
事务的状态:
开启事务 事务提交:commit() 事务回滚:rollback() 关闭事务 转账: A:1000 B:1000 结果: A(900) --100--> B(1100) 事务: A:SQL:1000-100; B:SQL:1000+100; 把这一组SQL放在一个事务中,要么都成功,要么都失败;
Junit单元测试:
依赖:
<!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
使用:
@Test注解只有在方法上有效,只要加了这个注解的方法,就可以直接运行!
@Test public void test(){ System.out.println("Hello"); }
代码案例:A给B转账:测试事务
/** * 测试事务 */ public class TestJDBC3 { @Test public void test() { //配置信息 String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8"; String username="root"; String password="root"; Connection conn =null; try { //1,加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2,建立连接: conn = DriverManager.getConnection(url, username, password); //3,通知数据库开启事务 conn.setAutoCommit(false);//fasle是开启 //3,编写SQL String sql1="update account set money=money-100 where name='A'"; conn.prepareStatement(sql1).executeUpdate(); int j=1/0; //制造错误 String sql2="update account set money=money+100 where name='B'"; conn.prepareStatement(sql2).executeUpdate(); conn.commit();//以上2条SQL都执行成功了, 就提交事务! System.out.println("SQL执行成功"); } catch (Exception e) { e.printStackTrace(); try { //SQL执行失败,就回滚事务 conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } }finally { try { //6,关闭连接 conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }