Spring事物详解和传播行为

事物的四大特性ACID

  • 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
  • 一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
  • 隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
  • 持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

Spring事物传播机制

Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。我们在使用Spring声明式事务时,有一个非常重要的概念就是事务属性。事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成。我们在进行事务划分时,需要进行事务定义,也就是配置事务的属性

spring在TransactionDefinition接口中定义了七个事务传播行为:

  • propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
  • propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
  • propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
  • propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
  • propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
  • propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring事务的传播行为指的是一个事务方法调用另一个事务方法时,事务如何传播行为Spring框架提供了7种事务传播行为,分别是REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和NESTED。 1. REQUIRED 如果当前没有事务,则创建一个新事务。如果当前存在事务,则加入该事务中。这是默认的传播行为。 示例代码: ```java @Transactional(propagation = Propagation.REQUIRED) public void method1() { // 业务逻辑 method2(); // 调用method2方法 } @Transactional(propagation = Propagation.REQUIRED) public void method2() { // 业务逻辑 } ``` 在method1方法中调用method2方法时,如果method2方法没有事务,则会加入method1方法的事务中。 2. SUPPORTS 如果当前有事务,则加入该事务中。如果当前没有事务,则以非事务方式执行。 示例代码: ```java @Transactional(propagation = Propagation.REQUIRED) public void method1() { // 业务逻辑 method2(); // 调用method2方法 } @Transactional(propagation = Propagation.SUPPORTS) public void method2() { // 业务逻辑 } ``` 在method1方法中调用method2方法时,如果method1方法有事务,则method2方法会加入method1方法的事务中。如果method1方法没有事务,则method2方法会以非事务方式执行。 3. MANDATORY 如果当前有事务,则加入该事务中。如果当前没有事务,则抛出异常。 示例代码: ```java @Transactional(propagation = Propagation.REQUIRED) public void method1() { // 业务逻辑 method2(); // 调用method2方法 } @Transactional(propagation = Propagation.MANDATORY) public void method2() { // 业务逻辑 } ``` 在method1方法中调用method2方法时,如果method1方法有事务,则method2方法会加入method1方法的事务中。如果method1方法没有事务,则会抛出异常。 4. REQUIRES_NEW 如果当前有事务,则挂起该事务,并创建一个新事务。如果当前没有事务,则创建一个新事务。 示例代码: ```java @Transactional(propagation = Propagation.REQUIRED) public void method1() { // 业务逻辑 method2(); // 调用method2方法 } @Transactional(propagation = Propagation.REQUIRES_NEW) public void method2() { // 业务逻辑 } ``` 在method1方法中调用method2方法时,如果method1方法有事务,则method2方法会挂起method1方法的事务,并创建一个新事务。如果method1方法没有事务,则method2方法会创建一个新事务。 5. NOT_SUPPORTED 以非事务方式执行。如果当前存在事务,则挂起该事务。 示例代码: ```java @Transactional(propagation = Propagation.REQUIRED) public void method1() { // 业务逻辑 method2(); // 调用method2方法 } @Transactional(propagation = Propagation.NOT_SUPPORTED) public void method2() { // 业务逻辑 } ``` 在method1方法中调用method2方法时,如果method1方法有事务,则method2方法会以非事务方式执行。如果method1方法没有事务,则method2方法也会以非事务方式执行。 6. NEVER 以非事务方式执行。如果当前存在事务,则抛出异常。 示例代码: ```java @Transactional(propagation = Propagation.REQUIRED) public void method1() { // 业务逻辑 method2(); // 调用method2方法 } @Transactional(propagation = Propagation.NEVER) public void method2() { // 业务逻辑 } ``` 在method1方法中调用method2方法时,如果method1方法有事务,则会抛出异常。如果method1方法没有事务,则method2方法会以非事务方式执行。 7. NESTED 如果当前有事务,则在该事务中嵌套一个新事务,如果当前没有事务,则创建一个新事务。 示例代码: ```java @Transactional(propagation = Propagation.REQUIRED) public void method1() { // 业务逻辑 method2(); // 调用method2方法 } @Transactional(propagation = Propagation.NESTED) public void method2() { // 业务逻辑 } ``` 在method1方法中调用method2方法时,如果method1方法有事务,则在该事务中嵌套一个新事务。如果method1方法没有事务,则method2方法会创建一个新事务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值