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

一、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的插入成功。

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

 

 

 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中的不可重复读和幻是两种并发控制问题。 不可重复读(Non-repeatable Read)是指在一个事务中,多次取同一数据,在这个事务还没有结束时,另外一个事务也修改了这个数据,导致多次取的结果不一致。换句话说,一个事务在执行期间,另一个事务对数据进行了修改,导致当前事务多次取的结果不同。 幻(Phantom Read)是指在一个事务中,多次查询同一范围的数据,在这个事务还没有结束时,另外一个事务插入了符合同一范围的数据,导致多次查询的结果不一致。换句话说,一个事务在执行期间,另一个事务对数据进行了插入或删除操作,导致当前事务多次查询的结果不同。 为了解决不可重复读和幻的问题,MySQL提供了不同的隔离级别。隔离级别定义了一个事务对其他事务的可见性和影响范围。MySQL支持四个隔离级别: 1. 提交Read Uncommitted):最低级别,事务可以取到其他事务提交的数据,可能出现脏、不可重复读和幻问题。 2. 提交Read Committed):默认级别,事务只能取到其他事务已提交的数据,可以避免脏,但仍可能出现不可重复读和幻问题。 3. 可重复读(Repeatable Read):事务在执行期间,多次取同一数据时会返回一致的结果,可以避免不可重复读,但仍可能出现幻问题。 4. 串行化(Serializable):最高级别,事务依次执行,避免了脏、不可重复读和幻问题,但牺牲了并发性能。 开发者可以根据具体需求选择合适的隔离级别来解决不可重复读和幻问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值