事务
事务说白了就是做某一套事情的全部流程,如果其中的某一个环节出现错误了,那么就不能继续进行下去,在这个流程中,发生错误之前的操作也要撤回。
要么走完一整个流程,要么就回到最初的状态,不允许不完整的执行。
同时在一个流程在被操作的时候,只能有一个操作者。操作前后发生的变化要一致,符合事实。
其实和现实生活中的要求是一致的。只不过在这里叫做事务。
事物的回滚:只要有一个子模块失败了,就让所有的操作(数据)重新回到最原始的状态
事物的提交:所有的子模块全部正确的执行,整个事物完成
JDBC事务测试代码
Con.setAutoCommint(boolean) 设置成false改为手动提交,必要要手动执行commit方法才回去更改数据库 ,jbdc默认的提交方式是自动提交 true
Rollback 事物回滚,回到最原始的状态
@Test
public void test1() {
Connection con=JdbcUtil.getConnection();
PreparedStatement ps=null;
try {
//将事物的提交方式改成手动提交,默认是true自动提交
con.setAutoCommit(false);
//将张三的账户减去1000元
ps = con.prepareStatement("update counts set money=money-1000 where id =1");
ps.executeUpdate();
System.out.println(1/0); //手动设置的错误,为了测试
//将李四账户加1000
PreparedStatement p1=con.prepareStatement("update counts set money=money+1000 where id =2");
p1.executeUpdate();
con.commit();//所有的操作都正确执行了,最后手动将事物提交
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
System.out.println("出现异常,事物回滚了");
con.rollback();//将事物回滚,回到最初的状态
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
JdbcUtil.close(con, ps, null);
}
事务的四个特性
1:原子性:事务包含的所有操作要么全部成功,要么全部失败回滚;成功必须要完全应用到数据库,失败则不能对数据库产生影响;
2:一致性:事务执行前和执行后必须处于一致性状态,
例:用户A和用户B的前加起来一共是30000; 无论AB用户之间是如何相互转换的,事务结束后两个用户的钱加起来还是30000,这就是事务的一致性。
3:隔离性:当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不被其他事务的操作所干扰,多个并发事务之间要相互隔离;
4:持久性:一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便在数据库系统遇到故障的情况下也不会丢失事物的操作
事务的四个隔离级别
1、Read uncommitted(读未提交):最低级别,任何情况都会发生。
2、Read Committed(读已提交):可避免脏读的发生。
3、Repeatable read(可重复读):可避免脏读、不可重复读的发生。
4、Serializable(串行化):避免脏读、不可重复读,幻读的发生。一般用于银行