什么是事务?
理解:以转账来理解的话,事务就是转账的一个完整的流程,有账户减钱就有账户加钱。而不应该出现一个减钱失败了,而另一个加钱成功,这样就破坏了数据的完整性。一组业务操作,要么都执行,要么都不执行。
特性:4个,可以简写为ACID
A:原子性
C:一致性
I:隔离性
D:持久性
隔离问题:
脏读:一个事务读到另一未提交的数据
不可重复读:一个事务读到一已提交的数据(update)
虚读(幻读):一个事务读到已提交的数据(insert)
隔离级别:
read uncommitted:读未提交。存在3个问题
read committed:读已提交。解决脏读,存在2个问题
repeatable read:可重复读。解决:脏读、不可重复读,存在1个问题。
serializable :串行化。都解决,单事务。
案例1
ABCD 一个事务 Connection conn = null; try{ //1 获得连接 conn = ...; //2 开启事务 conn.setAutoCommit(false); A B C D //3 提交事务 conn.commit(); } catche(){ //4 回滚事务 conn.rollback(); } |
案例2
需求:AB(必须),CD(可选) Connection conn = null; Savepoint savepoint = null; //保存点,记录操作的当前位置,之后可以回滚到指定的位置。(可以回滚一部分) try{ //1 获得连接 conn = ...; //2 开启事务 conn.setAutoCommit(false); A B savepoint = conn.setSavepoint(); C D //3 提交事务 conn.commit(); } catche(){ if(savepoint != null){ //CD异常 // 回滚到CD之前 conn.rollback(savepoint); // 提交AB conn.commit(); } else{ //AB异常 // 回滚AB conn.rollback(); } } |