long blogs

进一步有进一步惊喜


  • Home
  • Archive
  • Tags
  •  

© 2025 long

Theme Typography by Makito

Proudly published with Hexo

Spring 事务

Posted at 2019-09-02 笔记 spring 

Spring 事务传播特性

1、事务属性的种类

  • 传播行为
  • 隔离级别
  • 只读
  • 事务超时

1.1 传播行为

  • 传播行为定义了被调用方法的事务边界
  • PROPERGATION_MANDATORY 方法必须运行在一个事务中,如果当前事务不存在,就抛出异常
  • PROPAGATION_NESTED 如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和PROPAGATION_REQUIRED没有什么两样。
  • PROGATION_NEVER 方法不能运行在一个事务中,否则会抛出异常
  • PROGATION_NOT_SUPPORTED 方法不能运行在一个事务中,如果当前存在事务,那么该方法将被挂起
  • PROGATION_REQUIRED 当前方法必须运行在一个事务中,如果存在事务,则运行在该事务中,否则创建一个新的事务
  • PROGATION_REQUIRES_NEW 必须运行在自己的事务中,如果当前存在一个事务,那么这个事务将在该方法运行期间被挂起
  • PROGATION_SUPPORTS 当前方法不需要运行在一个事务中,如果有一个事务存在,该方法也可以运行在这个事务中。

1.2 隔离级别

(1) 未提交读 (2)已提交读 (3) 可重复读 (4) 可序列化

  • ISOLATION_DEFAULT 后端数据库默认的隔离级别
  • ISOLATION_READ_UNCOMMITTED 允许读取未提交的数据。可能导致脏读、不可重复读、幻读(未提交读)
  • ISOLATION_REPEATABLE_READ 一个事务不可能更新由另一个事务修改但未提交(回滚)的数据。(对应不可重复读),可避免脏读、不可重复读、但无法避免幻读
  • ISOLATION_SERIALIZATABLE 所有的事务都在一个执行队列中,依次顺序执行,而不是并行(可序列化)。可以避免脏读、不可重复读、幻读。但效率低

1.3 只读

只读数据而不更新,READ_ONLY_MARKER

1.4 事务超时

超时回滚,避免浪费系统资源

1.5 理解

  • 什么是未提交读? 读取未提交的数据
  • 什么是脏读? 一个事务读取另一个事务未提交的数据,数据更改后,第一个事务读取的数据是脏数据,不可用。
    比如:A事务对数据a进行a++操作,a未提交。B事务读取A事务的a值。但是A事务出错回滚了。这时候B事务中的a值就是脏数据,导致脏读。
  • 什么是不可重复读?一个事务中两次读取一个数据的结果不一致导致的。不能重复读出相同的数据。
  • 什么是幻读?事务A第一次读取数据库中数据和第二次读取的数据不一致。比如:事务A第一次读取成绩及格的学生数为20个。事务B又往数据库添加一条及格的记录。事务A第二次读取成绩几个的学生数为21个。产生幻读。数据库会使用加表级锁就可以避免。
  • 可序列化?事务是一个一个排队完成。这是后可以避免上述的问题。但是效率低下。

Share 

 Previous post: Redis笔记 Next post: 千奇百问 

© 2025 long

Theme Typography by Makito

Proudly published with Hexo