InnoDB事务隔离级别

新说Mysql事务隔离级别

Mysql中事务ACID实现原理

事务隔离级别是ACID中的I。

事务隔离级别有:

读未提交(RU):事务能够读取到其他事务还未提交的数据。

读已提交(RC):事务只能读取到其他事务已经提交的数据。

可重复读(RR):事务多次读取的数据是相同的。

可串行化(S):完全串行化的读,每次读都需要获得表级共享锁,读写相互会阻塞。

read uncommitted,read committed,repeated read,serializable

脏读:就是指一个事务正在修改数据库,修改还没有提交,此时另一个事务也访问数据库,使用了这个数据,就造成了脏读。脏读是非常危险的,因为数据可以在提交之前回滚,执行脏读的事务读取了没有被数据库认可的数据。读未提交的隔离级别会出现脏读。

不可重复读:就是指事务两次读取数据,返回结果不一样。更准确地说,在行不变的情况下(主键索引不变),这一行数据发生变化,如果是增加或删除一条数据,那就不是不可重复读。

幻读:在一次事务查询结果里出现某一行数据,但是该数据没有出现在之前的查询结果里。是由于另一个事务插入某一行数据或者更新某一行数据,并提交了。

在我看来脏读也是不可重复读现象,但是不可重复读还有一种额外情况是脏读没有的,就是一个事务读取了另一个事务已经提交的数据,导致前后两次读取不一样。

幻读跟不可重复读也很像,事务第二次查询出了一个数据,但是该数据并未出现在第一次查询的结果集里。如果该数据是修改数据,那么该现象既属于不可重复读,也属于幻读。如果该数据是新增或删除的数据,那该现象就不属于不可重复读,但属于幻读。

防止不可重复读的措施在于,将事务已经读取的数据的行加锁,这样再次读取的时候,不会发生变化,但是却无法锁住insert数据。insert导致事务读取到的数据多了之前没有出现过的行,这就是幻读。幻读不能通过行级锁解决,可串行化隔离级别能够防止幻读的出现。可串行化隔离级别,读用读锁,写用写锁,读锁与写锁互斥,因此无法在正在读的数据中写入数据,可以有效避免脏读/不可重复读/幻读,但是数据库并发能力下降。

不可重复读和幻读最大的区别在于,如何通过锁机制解决它们的问题。

MVCC使用乐观锁避免这两个问题。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值