spring中事务的传播行为和隔离级别,不同的传播行为,对于事务的处理方式不同。 简单介绍一下各个传播行为: 1、PROPAGATION_REQUIRED:若当前存在事务,则加入该事务,若当前不存在事务,则新建事务;@Transactional(propagation = Propagation.REQUIRED)。 2、PROPAGATION_REQUIRED_NEW:若当前没有事务,则新建事务;若当前存在事务,则新建事务;新老事务相互独立,外部事物报错回滚,不影响内部事务提交@Transactional(propagation = Propagation.REQUIRE_NEW)。 3、PROPAGATION_NESTED:如果当前存在事务,则嵌套在当前事务中执行,如果没有事务则新建事务,@Transactional(propagation = Propagation.NESTED) 4、PROPAGATION_SUPPORTS:支持当前事务,若不存在事务;则已非事务的方式执行@Transactional(propagation = Propagation.SUPPORTS)。 5、PROPAGATION_NOT_SUPPORTED:以非事务的方式执行,若当前存在事务,则挂起当前事务@Transactional(propagation = Propagation.NOT_SUPPORTED)。 6、PROPAGATION_MANDATORY:强制事务执行,若当前不存在事务,则抛出异常@Transactional(propagation = Propagation.MANDATORY)。 7、PROPAGATION_NEVER:以非事务的方式执行,如果存在事务,则抛出异常@Transactional(propagation = Propagation.NEVER)。 隔离级别:是指若干个并发事务之间的隔离程度 1、读未提交(READ_UNCOMMITED):允许读取还未提交的改变了的数据。可能导致脏读、幻读、不可重复读。 2、读已提交(READ_COMMITED):允许在并发事务已经提交后读取。可防止脏读,但幻读、不可重复读仍可能发生。 3、可重复读(REPEATABLE_READ):对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏读、不可重复读。但幻读仍可能发生。 4、可串行化(SERIALIZABLE):事务顺序执行,可避免脏读、不可重复读、幻读,但效率最差。因为A事务执行时,要完全锁住在事务中涉及的数据表。 接下来是我遇到的问题: 由于在前一步操作的过程开启了行锁且再该方法中使用了**@Transactional(rollbackFor = Exception.class)** ,在后续的操作中又使用了**@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)** ,因此,后续的保存方法中无法保存导致前一个操作加锁和后续操作无法保存;导致相互等待而造成死锁。所以在开发过程中使用事务时要格外注意。
springboot 事务嵌套问题_spring嵌套事务导致死锁
最新推荐文章于 2024-03-08 10:26:52 发布