Spring学习笔记(六)-事务概念
Spring学习笔记(六)-事务概念
事务
-
一些作为整体的sql语句,不可分割,同时成功或失败
-
mysql执行事务 beginTransaction 开启事务 select * from student where Xxx updata school set Xxx=Xxx endTransaction 事务结束
-
保持数据的一致性
-
在业务层进行事务支持
事务管理器
-
不同的数据库访问技术有不同的事务处理
-
mysql中的事务控制
-
public void updataAccount(){ try{ Connection coo = ... coo.setAutoCommit(false); ... ... coo.commit; coo.setAutoCommit(true); }catch(Exception e){ conn.rollback(); }finally{ //释放资源... } }
-
-
Mybatis事务的处理
-
public void updataAccount(){ try{ SqlSession session = SqlSessionFactory.openSession(false); ... ... session.commit; }catch(Exception e){ session.rollback(); }finally{ //释放资源... } }
-
-
Spring统一管理事务,将不同的数据库访问技术的事务处理统一起来,开发只需掌握Spring的事务处理方案就可以实现不同的数据库访问技术,Spring使用事务管理器处理
Spring事务管理器
- Spring事务管理器,用于事务管理的接口对象
- 事务管理器是PlatformTransactionManager接口对象,主要用于完成事务的提交、回滚、及获取事务的状态信息
- 事务管理器有多种实现类,不同的数据库访问技术有不同的实现类,由具体的实现类完成事物的控制
- JDBC和Mybatis的事务管理器实现类:DataSourceTransactionManager
- Hibernate框架的事务管理器实现类:HibernateTransactionManager
Spring事务管理使用环绕通知
-
环绕通知:可以增强目标方法而不需要修改目标代码
-
@Around(value="execution(* *..add*(..))") public Object myAround(ProceedingJoinPoint pjp){ try{ PlatformTransactionManager.beginTransaction(); pjp.procced(); PlatformTransactionManager.commit(); }catch(Exception e){ PlatformTransactionManager.rollback(); }finally{ //释放资源 } }
事务定义接口TransactionDefinition
-
定义了有关事务控制的属性
- 隔离级别
- 传播行为
- 事务超时
-
给业务方法说明事务属性与ACID不同
-
隔离级别:
- 控制事务之间互相影响的程度:
- DEFAULT:Mysql中默认使用可重复读,Oracle默认为读并提交
- READ_UNCOMMITTED:读未提交,未解决任何并发问题,可读取到其他事务未提交的数据,存在脏读问题,在其他事务回滚后存在数据错误
- READ_COMMITTED:读已提交,解决脏读问题,存在不可重复读与幻读,其他事务提交之后才能读取到其他事务提交到的数据,存在不可以重复读问题,在其他事务提交的前后读取到的数据存在不一致的可能性
- REPEATABLE_READ:可重复读,解决脏读、不可重复读,存在幻读,本事务开启后其他事务不再被允许进行修改操作,然而其他事务可以进行INSERT增删操作,导致数据记录在本次事务间突然发现变化为幻读
- SERIALIZABLE:串行化,不存在并发问题
- 控制事务之间互相影响的程度:
-
事务超时
- 默认为-1,表示“无上限”
- 以秒为单位,表示一个业务方法最长的执行时间,达到时间没有执行完成,Spring进行回滚操作
-
传播行为
- 业务方法在调用时,事务在方法之间的传递和使用,使用传播行为能够标识方法有无事务
- REQUIRED:
- Spring默认的传播行为,方法在调用的时候存在事务则使用当前事务,如果没有事务则新建事务,方法在新事务中执行
- 如该传播行为加在 doOther()方法上。若 doSome()方法在调用 doOther()方法时就是在事务内运行的,则 doOther()方法的执行也加入到该事务内执行。若 doSome()方法在调用doOther()方法时没有在事务内执行,则 doOther()方法会创建一个事务,并在其中执行。
- PROPAGATION_SUPPORTS:
- 有则加入当前事务,无则也不自加
- PROPAGATION_REQUIRES_NEW:
- 总是新建一个事务,如果当前存在事务则挂起当前事务,直到新事务执行完毕