美文网首页
Spring的Transactional注解解析与事务的传播机制

Spring的Transactional注解解析与事务的传播机制

作者: 等一个人丶 | 来源:发表于2020-03-26 17:44 被阅读0次

定义

transactional源码

@Transactional的特性有:

1. 可以在类或方法(接口)上标注

标注在类上:类中所有方法都进行事务管理

标注在接口上、实现类的方法上:方法进行事务管理

2. 优先级:方法注解 > 类注解

属性

1. value和transactionManage: 事务管理器,Platform TransactionManager接口

2. propagation: 事务传播机制,默认值为Propagation.REQUIRED

事务传播机制与特性:

1. REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。(默认值,也是绝大多数使用场景)

2. SUPPORTS:如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。

3. MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

4. REQUIRES_NEW: 总算开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

5. NOT_SUPPORTED: 总算非事务地执行,并挂起任何存在的事务。

6.NEVER: 总是非事务的执行,如果存在一个活动事务,则抛出异常。

7. NESTED: 如果一个活动的事务执行,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。

事务隔离级别:

1. DEFAULT: 使用后端数据库默认的隔离级别。(默认值,也是绝大多数场景)

2. READ_UNCOMMITTED: 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

3. READ_COMMITTED: 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

4. REPEATABLE_READ: 对同一字段读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

5. SERIALIZABLE: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

使用@Transactional需要注意的地方

1. @Transactional需要用到public方法才有效。

2. 在默认配置中,Spring Framework的事务框架代码只会将出现runtime,unchecked异常的事务标记为回滚;也就是说事务中抛出的异常是RuntimeException或其子类,这样事务才会回滚(默认情况下Error也会导致事务回滚)。但是,在默认配置的情况下,所有的checked异常都不会引起事务回滚。

相关文章

网友评论

      本文标题:Spring的Transactional注解解析与事务的传播机制

      本文链接:https://www.haomeiwen.com/subject/vmocuhtx.html