事务隔离属性spring传播属性 @Transactional注解

Posted QQ_851228082

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事务隔离属性spring传播属性 @Transactional注解相关的知识,希望对你有一定的参考价值。

mysql默认的隔离级别是repeatable_read

根据spring文档,数据库一共有4个隔离级别

  • read_uncommit
  • read_commited
    • 读已提交 ,解决了脏读
  • repeatable_read
    • 可重复读,解决了不可重复读
  • serializable
    • 顺序化 ,解决了幻读

脏读、不可重复读、幻读

对应的java类,org.springframework.transaction.annotation.Isolation

  • 脏读
    • 事务1修改了行1,但是还没commit,事务2读取了未commit的行1,事务1回滚了行1;
  • 不可重复读
    • 事务1读了行1,事务2修改了行1并commit,事务1再次读了行1,发现行1变了。
  • 幻读
    • 事务1读了满足where条件的所有行,事务2插入了满足where的一行,事务1再读同样的where条件时,获取了额外的“幻行”。

spring传播属性

spring事务传播属性,org.springframework.transaction.annotation.Propagation,其他有

  • required
    • 当前有事务,则利用已有事务;当前没有事务,则创建事务;
  • required_new
    • 创建新事物,如果存在事务,暂停当前事务;注意这里的措辞,先创建新事务,然后再判断是否存在事务,如果存在,则暂停;
  • supports
    • 当前有事务,使用当前事务,否则无事务执行;
  • nested
    • 如果当前存在事务,则创建子事务,其他的就跟required相同;只在特定的事务管理器支持nested,开箱即用的有JDBC DataSourceTransactionManager,有些JTA providers可能也支持nested事务;
  • never
    • 非事务执行,如果有事务则抛出异常;
  • mandatory
    • 使用当前事务,如果没有事务则抛出异常;

@Transactional注解

@Transactional注解
事务超时时间:依赖底层事务系统,取决于数据库。

  • rollbackfor
    • 默认RuntimeException回滚;checked exceptions(business exception)不会回滚;
  • readonly
    • 只能有查询语句,不能有update、insert语句,仅对required、required_new起作用。

总结

隔离级别和传播属性是两个概念,隔离级别属于数据库,传播属性是spring的,它们的所有者是不同的;隔离级别是为了解决事物间影响的问题;传播属性是为了解决,方法间事务互相利用的问题;

以上是关于事务隔离属性spring传播属性 @Transactional注解的主要内容,如果未能解决你的问题,请参考以下文章

Spring事务传播属性和隔离级别

Spring事务传播属性和隔离级别

事务隔离属性spring传播属性 @Transactional注解

Spring支持的常用数据库事务传播属性和隔离级别

浅析Spring事务传播行为和隔离级别

Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别