avatar

事务传播行为与事务隔离级别

事务

事务读传播行为

· 保证同一个事务中

PROPAGATION_REQUIRED支持当前事务,如果不存在,就新建一个(默认)
PROPAGATION_SUPPORTS支持当前事务,如果不存在,就不适用事务
PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常

· 保证没有在同一个事务中

PROPAGATION_REQUIRES_NEW如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行

事务隔离级别

DEFAULT这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别;

未提交读(read uncommitted):

​ 事务的修改,即使当前事务没有被提交,对其他事务而言也是可见的。事务可以读取未提交的数据,也称为脏读。这个级别会导致很多问题,性能上也不比其他级别好多少,一般不会使用;

已提交读(read committed):

​ 大部分数据库系统的默认隔离级别都是read committed(Mysql 不是),它表示一个事务只能看到已经提交的事务所做的修改。换个角度来讲,就是一个事务从开始到提交之前,所做的操作对别的操作都是不可见的。此隔离级别也被称为(不可重复读),因为多次执行同样的查询语句,可能会得出不一样的结果,因为可能有别的事务提交了。

可重复读(repeatable read):

​ repeatable read解决了脏读的问题,该隔离级别保证了在同一个事务中每次读取都是同样的结果,但是还是无法解决幻读的问题。(幻读:指的是当某个事务在读取某个范围内的记录时,另一个事务又在该范围内插入了新的记录,当之前的事务再读取该范围内的记录时,会产生幻行;)【这是高性能Mysql中的解释,我的个人理解为:先读取的事务读不到后来新添加的记录,导致读取不准确】。但InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC)解决了幻读的问题,后面我会详细写到。

可串行化的(serializable):

强制事务串行执行,由于可能会导致大量的超时和锁争用,通常不考虑。
MySQL默认:可重复读
Oracle默认:已提交读

文章作者: Frosro
文章链接: https://frosro.github.io/2020/06/04/%E4%BA%8B%E5%8A%A1%E4%BC%A0%E6%92%AD%E8%A1%8C%E4%B8%BA%E4%B8%8E%E4%BA%8B%E5%8A%A1%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 BETTER LATE THAN NEVER
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论