美文网首页
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