Spring事务控制

张开发
2026/5/16 22:44:42 15 分钟阅读
Spring事务控制
Spring事务控制1.什么是事务?事务是逻辑上的一组操作,组成这组操作的基本逻辑单元,要么都成功,要么都失败.2.事务的特性?(ACID)原子性:事务是一个原子操作,由一系列动作组成,要么都成功,要么都失败一致性:事务执行操作前后,无论成功还是失败,数据都应该保持一致隔离性:可能有多个事务同时处理同一个数据,他们之间不会相互影响.每个事务都应和其他的事务隔离开持久性:事务一旦完成,结果会长久保存3.事务定义信息隔离级别传播行为超时信息是否只读4.安全问题脏读:一个A事务读取了另一个B事务尚未提交的信息,如果改动在稍后被回滚了,那么这个A事务获取的数据无效不可重复读:同一个事务中,对于同一数据,执行完全的select语句,可能看到不同的结果幻读:当用户读取某一范围的数据行时另一个事务又在该范围内插入了新行当用户再读取该范围的数据行时会发现有新的“幻影” 行5.Spring进行事务操作方式编 程 式 事 务在 项 目 中 很 少 使 用 , 这 种 方 式 需 要 注 入 一 个 事 务 管 理 对 象 TransactionTemplate ,然后在我们代码中需要提交事务或回滚事务时自己写代码实现.声明式事务管理基于xml配置文件方式配置事务管理器,并注入数据源!-- 配置 spring 事务管理类, 并注入数据源 --beanidtransactionManagerbeanidtransactionManagerclassorg.springframework.jdbc.datasource.DataSourceTransactionManagerpropertynamedataSourcerefdataSource/property/beanXml配置tx:adviceidtxadvicetransaction-managertransactionManagertx:attributestx:methodnamesave*propagationREQUIRED//tx:attributes/tx:adviceaop:configaop:pointcutexpressionexecution(* com.lwb.service.*(..))idallMethod/aop:advisoradvice-reftxadvicepointcut-refallMethod//aop:config思想就是AOP基于注解方式配置事务管理器,并注入数据源!-- 配置 spring 事务管理类, 并注入数据源 --beanidtransactionManagerbeanidtransactionManagerclassorg.springframework.jdbc.datasource.DataSourceTransactionManagerpropertynamedataSourcerefdataSource/property/bean注解配置!-- 开启注解事务管理 --tx:annotation-driventransaction-managertransactionManager/实体类ServiceTransactional//默认为Transactional(propagationPropagation.REQUIRED)publicclassUserService{AutowiredUserDaouserDao;AutowiredLogServicelogService;}6.Spring事务传播行为什么叫事务传播行为即然是传播那么至少有两个东西才可以发生传播。单体不存在传播这个行为。 事务传播行为propagation behavior指的就是当一个事务方法被另一个事 务方法调用时这个事务方法应该如何进行。事务传播行为是 Spring 框架独有 的事务增强特性他不属于的事务实际提供方数据库行为例如:A 方法调用 B 事务方法时B 是继续在调 用者 A 的事务中运行呢还是为自己开启一个新事务运行这就是由 B 的事务传播行为决定的。事务传播行为类型说明PROPAGATION_REQUIRED如果当前没有事务就新建一个事务如果已经存在一个事务中,加入到这个事务中。如果A不是事务方法,就新建一个事务,反之,加入到A这个事务中PROPAGATION_SUPPORTS支持当前事务如果当前没有事务就以非事务方式执行。如果A不是事务方法,B也就没有事务,反之,加入到A这个事务中PROPAGATION_MANDATORY使用当前的事务如果当前没有事务就抛出异常。如果A不是事务方法,抛出异常,反之,加入到A这个事务中PROPAGATION_REQUIRES_NEW新建事务如果当前存在事务把当前事务挂起。B是一个新的独立的事务.A事务异常不会影响B事务PROPAGATION_NOT_SUPPOR TED以非事务方式执行操作如果当前存在事务就把当前事务挂起B以非事务的方式进行,执行完后执行被挂起的APROPAGATION_NEVER以非事务方式执行如果当前存在事务则抛出异常。如果A不是事务方法,B以就非事务的方式进行,反之,抛出异常PROPAGATION_NESTED如果当前存在事务则在嵌套事务内执行。如果当前没有事务则执行与 PROPAGATION_REQUIRED 类似的操作。如果A不是事务方法,就新建一个事务,反之,就会在在嵌套事务内执行嵌套事务嵌套事务是一个外部事务的一个子事务是一个外部事务的一个组成部分当嵌套事务发生异常而回滚则会回复到嵌套事务的执行前的状态相当于嵌套事务未执行。如果外部事务回滚则嵌套事务也会回滚外部事务提交的时候它才会被提交。PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大区别在于, PROPAGATION_REQUIRES_NEW 完全是一个新的事务, 而 PROPAGATION_NESTED 则是外部事务的子事务, 如果外部事务 commit, 潜套事务也会被 commit, 这个规则同样适用于 roll back.事务的传播行为失效的场景不能在同一个类中的方法互相调用出现异常被catch捕获了修饰非public方法传播行为配置错误

更多文章