当前位置:   article > 正文

MYSQL--未提交(read uncommitted)、读已提交(read committed)和repeatable read(可重复读)

read uncommitted

一、read uncommitted(读未提交)--脏读(Dirty Read)

读未提交的概念:允许一个事务可以看到其他事务未提交的修改。

第一步,建account(账户)表,属性有id(编号)和balance(金额) 。

第二步:

(1)在原窗口调整隔离级别为read uncommitted。

 (2)打开新窗口,调整隔离级别为read uncommitted(未提交读)。

第三步:

(1)原窗口开启事务。

(2)新窗口开启事务。

第四步:

(1)原窗口事务1查询account表。

 

(2)新窗口事务2更新1号账户的钱,将钱加200,更新到1200。

 (3)在原窗口事务1验证,理论上read uncommitted(未提交读)模式下,虽然事务2未提交,但事务1可以读到事务1的更新值。结果验证如下,符合理论预期:

 

 第五步:

(1)在窗口2中回滚:事务2的更新操作。

(2)在窗口1中重新查询account表,理论上在事务2回滚后,事务1中查询会得到事务2回滚后的表。

结果验证如下,符合结果预期:

二、read committed(读已提交)

读已提交的概念:允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。

第一步:

在之前的基础上,将事务2改为read committed(读已提交)模式。

 第二步:

(1)在事务1中,更新账户1,将钱减两百,得800。

理论上事务2此时,已经只能看到其他事务已经提交的修改,所有事务1的减操作,事务2看不到,所以在事务2中查询,账户1的钱仍然是1000。

 

 (2)在事务2中验证如下,符合结果预期:事务2只能看到其他事务已提交的内容,事务1尚未提交,因此在事务2中的账户1的钱仍然是1000。

 

第三步:

(1)在事务1中提交之前的账户1更新操作。

理论上事务1提交操作后,事务2能看的到。所有再在事务2中查询,预期账户1的钱已变为800。

 

(2)在事务2中重新查询account表。

得到账户1的钱已经变为800,符合预期。

 

三、repeatable read(可重复读)

可重复读概念:确保如果在一个事务中执行两次相同的select语句,都能得到相同的结果,不管其他事务是否提交这些修改。

第一步:

(1)在之前的基础上,将事务2改为repeatable(可重复读)模式。

(2)在事务2中开启事务。

 

(3)在事务2中查询一次account表。

使用select * from account;

理论上事务2目前处于可重复读模式,无论其他事务怎么修改account表,后面再次执行该查询语句,结果应该和这次的一样。

 

(2)第二步:

(1)在事务1中插入账户3,初始的钱为1000。

(2)在事务1使用select * from account;

查询结果中出现了新增的账户记录。

 

第三步:

(1)返回事务2验证:

在事务2中使用select * from account;

事务2中的查询结果,没有事务1中新增的记录,成功验证:

在同一事务和可重复读模式下,无论其他事务怎么修改,原事务中执行相同的查询语句,前后结果相同。

第四步:

二道验证,看事务1是否将之前新的记录插成功:

在事务2中尝试插入账户3,钱为1000。

运行结果表示:id为3的插入冲突,说明id为3的账户记录已经存在,也就是事务1的插入成功。

该结果再次证明可重复读模式的功能,结论在上面的第三步。

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/239594
推荐阅读
相关标签
  

闽ICP备14008679号