Mysql四个事务隔离级别与MVCC多版本并发控制

今天来谈谈Mysql中的四个事务隔离级别

  1. Read uncommitted
  2. Read committed
  3. Repeatable table
  4. Serializable

Read uncommitted:如果什么锁都不加的,如果两个事务同时对一个数据进行写入修改操作的话,可能引起数据丢失问题,那么加一个X锁就好,就是如果你要对这个数据进行写入操作,必须获得X锁(排他锁),一个数据只有以X锁,这样就会防止数据丢失问题,达到第一个事务隔离级别。

Read committed:假如一个事务要给数据+50,然后加了50后,这时候另外一个事务读了加50后的数值,但这时候,前一个事务回滚了,不加50了,那么那个读了数据就是脏数据了,所以为了防止这种情况,S锁(共享锁)应运而生,这个锁是在读取数据时候加的,规定如果这个数据有了X锁,无法加s锁,有了S锁,无法加X锁,有s锁可以加s锁,s锁读完就解开。这要就就可以防止脏数据了。

Repeatable:有了X锁,S锁还不可以达到可重复读的要求,因为s锁是读完就解开,这样有什么问题?比如一个事务要读取一个数据两次,但期间有其他操作,那么中间这个数据是没有s锁的,那么其他事务如果这期间更改了,那么再次读的时候就和之前读的不一样了,所以这就是不可重复读问题,这个问题也很好解决,只要把s锁的锁定范畴规定在整个事务,只有整个事务commited才解开s锁。

最后来谈谈MVCC(多版本并发控制)

上面我们谈过为了达到数据可重复读的目的,我们把S锁的锁定范畴规定在整个事务,直到事务提交方可解锁,也就是是其他事务在其中一个事务有S锁的情况下,一直无法读取该数据,这严重影响数据库的性能。为此MVCC便横空出世。

MVCC不要求S锁在事务中一直锁定,读取完这个数据便可解锁,那如何达到可重复读呢?Mysql给表的每一行添加了两个隐藏字段事务ID和回滚指针

事务ID 回滚指针 name job
1 NULL 梅西 足球巨星

事务ID是一个递增的数值,有新的事务对这个数据进行update,这一行的的事务ID就是更新成新事务的ID的值,这有点像乐观锁之中的verson(不懂的自行百度)。

比如

事务ID(2) 事务ID(3)
读取name  
  更新name=“Messi"
读取name  
扫描二维码关注公众号,回复: 2558347 查看本文章

然后还有一个表RedaView里面记录当前活跃的事务列表

这里就是[2,3]

Tmin=2(最小值)

Tman=3+1=4(最大值加+1)

因为事务3对这个name进行update所以

事务ID 回滚指针 name job
1 NULL 梅西 足球巨星

变成

事务ID 回滚指针 name job
3 (指向上面) Messi 足球巨星

那么事务2第二次读取时候事务ID其实是3,而且name也被事务3更新了,那么为了可重复读,怎么读回原来name值,这时候回滚指针派上用场,它指向原来那条数据,MVCC有一个特定的算法来追踪原来信息。具体

这样就可以了,你们可以试一下。

猜你喜欢

转载自blog.csdn.net/weixin_38739218/article/details/81258624