提示:这本文入门使用


文章目录

  • 前言
  • Spring声明式事务(@Transactional)
    • 事务的配置


前言


提示:以下是本篇文章正文内容,下面案例可供参考

Spring声明式事务(@Transactional)

事务的传播特性指的是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行?
在事务嵌套的情况下,小事务统一由大事务来控制。

propagation = Propagation. REQUIRED
required:如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务。并在自己的事务内运行
required_new:当前的方法必须启动新事务,并在它自己的事务内运行.如果有事务正在运行,应该将它挂起
nested:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行。否则,就启动一个新的事务,并在它自己的事务内运行.

总结:
1、事务传播级别是REQUIRED,icheckout()被调用时(假定被另一类中commit()调用),如果checkout()中的代码抛出异常,即便被捕获,commit()中的其他代码都会ro1l back
2、是REQUIRES_NEw,如果checkout()中的代码抛出异常,并且被捕获,commit()中的其他代码不会roll back;如果commit()中的其他代码抛出异常,而且没有捕获,不会导致checkout()回滚
3、是NESTED,如果checkout()中的代码抛出异常,并且被捕获,commit()中的其他代码不公ro11 back;如果commit()中的其他代码抛出异常,而且没有捕获,会导致checkout()回滚
PROPAGATION_REQUIRES_NEw 启动一‘个新的,不依赖于环境的“内部”事务.这个事务将被完全commited或ro11ed back 而不依赖于外部事务,它拥有自己的隔离范围,自己的锁,等等,当内部事务开始执行时,外部事务将被挂起,内务事务结束时,外部事务将继续执行.
另一方面,PROPAGATION_NESTED 开始一个“嵌套的”事务,它是已经存在事务的一个真正的子事务.嵌套事务开始执行时,它将取得一个 savepoint.如果这个嵌套事务失败,我们将回滚到此 savepoint.潜套事务是外部事务的一部分,只有外部事务结束后它才会被提交.
由此可见,PROPAGATION_REQUIRES_NEW和 PROPAGATION_NESTED 的最大区别在于,
PROPAGATION_REQUIRES_NEW完全是一个新的事务,而 PROPAGATION_NESTED则是外部事务的子事务,如果外部事务commit,嵌套事务也会被commit,这个规则同样适用于roll back.

事务的配置

依赖于aop,所以aop配置也必须得有。

< aop:config>
<aop:pointcut id=“txPointcut” expression=" execution(* com.mashibing.service..(…))
< !–事务建议–>
<aop:advisor advice-ref="" pointcut-ref=“txPointcut”</aop:advisor>
</ aop:config>
<tx:advice id=“myAdvice” transaction-manager=transactionManager>
< !—-配置事务的属性–>
< tx:attributes>
< !——配置在哪些方法上添加事斜-→>
< tx:method name=“addBook” propagation-"REQLUIRED"read-only=“true” isolation -“DEEALLT./>
<tx:method name=“updatePrice” propagation"REQUIRED”></tx:method>
</tx:attributes>
</tx:advice>

红色必背

更多推荐

Spring基础知识05