Spring的Transactional注解解析与事务的传播机制和隔离级别

定义

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异常都不会引起事务回滚。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容