[Spring]事务相关

目录

事务的使用

事务隔离级别

Spring事务传播机制分类

注意嵌套和加入事务的区别

总结

测试方法设置不自动回滚


事务的使用


事务隔离级别

Spring 提供了以下五种事务隔离级别,用于控制多个事务之间的相互影响:

  1. DEFAULT(默认隔离级别): 使用底层数据库的默认隔离级别。通常为数据库的默认隔离级别,如 MySQL 是 REPEATABLE READ,Oracle 是 READ COMMITTED。

  2. READ_UNCOMMITTED(读取未提交数据): 允许事务读取未提交的数据。这是最低的隔离级别,它允许脏读、不可重复读和幻读的发生。

  3. READ_COMMITTED(读取已提交数据): 确保一个事务只能读取到已经提交的数据。它避免了脏读,但允许不可重复读和幻读。

  4. REPEATABLE_READ(可重复读): 确保一个事务在其生命周期内看到的数据是一致的,不受其他事务的影响。它避免了脏读和不可重复读,但允许幻读。

  5. SERIALIZABLE(串行化): 最高的隔离级别,确保事务串行执行,避免了脏读、不可重复读和幻读。它会在事务执行期间对数据进行锁定,可能导致性能问题。

@Transactional(isolation = Isolation.READ_COMMITTED)
public void doSomething() {
    // ...
}

Spring事务传播机制分类

Spring 的事务传播机制定义了在不同的事务方法之间如何传播事务。

  1. PROPAGATION_REQUIRED(默认):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务。这是大多数情况下的默认选择。

  2. PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。

  3. PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

  4. PROPAGATION_REQUIRES_NEW:每次都会创建一个新事务,如果当前存在事务,则将当前事务挂起。

  5. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则将当前事务挂起。

  6. PROPAGATION_NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。

  7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新事务。

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Transactional(propagation = Propagation.REQUIRED)
    public void methodWithRequiredPropagation() {
        // 业务逻辑代码
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodWithRequiresNewPropagation() {
        // 业务逻辑代码
    }

    @Transactional(propagation = Propagation.NESTED)
    public void methodWithNestedPropagation() {
        // 业务逻辑代码
    }

    // 其他方法...

}


注意嵌套和加入事务的区别

嵌套事务是在已经有的事务中加入另一个事务,相当于套娃的存在
也就是说在一个已存在的事务中开启另一个事务。这个嵌套的事务在外部事务的范围内,是外部事务的一部分。嵌套事务拥有自己的事务属性(例如隔离级别、传播行为等),但它的提交或回滚会影响到外部事务的状态。如果嵌套事务回滚,那么只有整个外部事务回滚,而不会单独回滚嵌套事务。

加入事务是在已经有事务加入进去,本质上和原来的事务还是同一个
被加入的事务和外部事务是同一个事务,它们共享同一个事务范围和属性。如果加入的事务回滚,那么整个事务都会回滚。


总结

  1. 事务范围: 嵌套事务和加入事务都是在已经存在的事务内部发生的,但嵌套事务可以有自己的保存点(Savepoint),而加入事务不具备自己的保存点,它们共享外部事务的保存点。

  2. 回滚影响: 嵌套事务的回滚只影响外部事务的状态,而不会单独回滚嵌套事务。加入事务的回滚会导致整个事务回滚。

  3. 行为表现: 嵌套事务在某些情况下允许内部事务独立地提交或回滚,相对来说更具有灵活性。加入事务则更多地表现为一个整体事务,内外事务共享相同的提交或回滚动作。


测试方法设置不自动回滚

注意: 测试方法会自动回滚!!!
@Rollback(false) // 禁用自动回滚


哈,谢谢各位同志的阅读,然后呢如果觉得本文对您有所帮助的话,还给个免费的赞捏
Thanks♪(・ω・)ノ

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值