亲测可重复读级别的作用,让你了解什么是幻读

208 阅读2分钟

这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

隔离级别是个老生常谈且清晰的话题。 不过一直对 幻读 的解析不是很明确。

今天实际操作了几轮,结合专业大佬文章,特给出明确且清晰的定义。

四个隔离级别:读未提交、读已提交、可重复读、串行化。

可重复读是mysql默认的隔离级别。 功能如其名字,就是每次读取出来的数据都是一样的。

自己测试的过程

建立一个简单的表结构users,有id,uname,age,adress,uno字段

查询隔离级别的sql:show variables like 'tx_isolation';
设置当前session隔离级别的:SET session TRANSACTION ISOLATION LEVEL read committed;(读已提交)

验证可重复的作用

1.该级别下,简单的查询sql(不适用for update或者lock in share mode),其实就是mvvc实现的快照读

在该级别事务下,每次查询出来的内容都是不变的,包括数据的增删改。 例如where age =10这个查询。第一次查询出来一条。无论你另一个事务, 新增一条age=10,或者删除所有的age=10。或者age=10这条record你修改任务一个字段,再次查询都不会变。这也就是可重复度的标准定义.

2.该级别下,加了for update等,也就是当前读(也叫加锁读),可以查询范围内的数据,从而避免幻读。

下面操作验证 标准的可重复读下幻读的case(也就是插入一条数据,查不出来)

客户端A (可重复读级别--用于写操作)
客户端B (可重复读级别--用于查询操作)
客户端C (读已提交--用于查询操作)

A开启事务 start transaction;
B开启事务
C开启事务

B查询where age = 10;无数据
C查询where age = 10;无数据

A insert *** age =10;的数据
BC都查不到。当然,还没提交呢。

A commit;

B再次查询,依旧查不到。
C可以查到数据了。(读已提交)

BC都commit;结束事务

在上面查询语句后面加上for update就可以查询出来那些插入或者删除的数据了。

如果开启串行化读,开启事务后,执行任务语句,都会等其他事务都执行完毕,才会执行该事务。也就是事务得一个个去执行。严格的正确性,也就是一个悲观锁,有事务就会阻塞。

写在最后:隔离级别的验证是非常简单的,读者如果有疑问,可以自己去随意操作试试。

参考好文:www.cnblogs.com/jian-gao/p/… zhuanlan.zhihu.com/p/107252435