定义
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异常都不会引起事务回滚。
网友评论