数据库隔离级别以及Spring事务传播

数据库隔离级别

说这个问题之前我们先说说三个概念。

脏读

当一个事务正在访问数据,并且对数据进行了修改,但这个修改了的数据还没提交到数据库中,然后另一个事务也访问了这个数据,那么我们就称这个事务读到的数据是脏数据。这个错误过程就叫脏读。

不可重复读

同一个事务内,多次读同一个数据。在这个事务还没结束时,另一个事务也访问这条数据并做了修改最后提交了修改数据。那么第一个事务可能在某次读的数据和之前的数据不同,这个问题就叫不可重复读。

幻读

当一个事务查询了某个表的所有数据,这时一个事务向这张表插入一条记录,当前一个事务再次读取数据时,发现多了一条记录,就像出现了幻觉一样。


可能很多人会不清楚不可重复读和幻读的区别。我个人的理解是,不可重复读重在更新某一条记录,即避免它只需要行级锁就行。而幻读则重在插入删除,避免它需要锁住整张表。这纯属个人理解,如若有误,请指出。


四种隔离级别

未提交

所有事务都可以看到其它未提交事务的执行结果。这一级别很少用在项目中,会出现上面三种错误情况。

读已提交

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的,MySQL是Repeatable Read)。一个事务只能看见已经提交事务所做的改变。但它只能避免脏读。

可重复读

这是MySQL的默认事务隔离级别。一旦事务在读取某条数据时,就会禁止别的事务修改它。它避免了不可重复读这一问题,但依旧会出些幻读。

可串行化

事务串行执行,有先后顺序,肯定不会出问题啦,就是效率较低。


Spring中的事务隔离
ISOLATION_DEFAULT

默认使用数据库当前的隔离级别。

ISOLATION_READ_UNCOMMITTED

读未提交。

ISOLATION_READ_COMMITTED

读已提交

ISOLATION_REPEATABLE_READ

可重复读

ISOLATION_SERIALIZABLE

可串行化


Spring事务传播

事务的特性

事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)。


传播行为


下面是Spring配置事务传播和事务隔离的一个小例子:



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值