这是我参与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