有关隔离级别的问题

来源:2-4 事务的隔离级别

洛奇丶大

2019-08-16 15:47:40

事务A,执行事务A里面红框的部分,不提交也不回滚

http://img.mukewang.com/climg/5d565dcf0001030a05620343.jpg

此时执行事务B

http://img.mukewang.com/climg/5d565dfe00014ac609000396.jpg

问题1、

无论事务B用哪种隔离级别,当A事务对SMITH的sal修改未提交或者回滚之前。事务B执行对同一数据的修改(修改SMITH的sal)都会一直等待(等待事务A的commit或者是rollback),这个是什么情况?

问题2、

视频中老师的例子都是A事务操作数据未完成,此时B事务又来操作事务A操作的数据,经过我测试后来的事务会一直等待。怎么解释?

问题3、

MySql的原子性,说的是事务执行之后必须状态是commit或者rollback,不能停在中间状态。事务A操作了数据,但是没有提交,事务B此时进来了,操作和事务A相同的数据。这就违背了原子性吧?因为事务A操作完了数据又没提交也没回滚,而是停在了中间状态。这样理解有问题吗?

写回答

1回答

好帮手乔木

2019-08-16

同学你好:

  1. mysql默认的隔离级别(可重复读(repeatable-read)):

    http://img.mukewang.com/climg/5d56666900016e9506170046.jpg

http://img.mukewang.com/climg/5d56686f00011dc604830355.jpg

http://img.mukewang.com/climg/5d5668cb00012f8b05530380.jpg

执行到第二步的时候,数据库中的信息

http://img.mukewang.com/climg/5d56674b000116b506220041.jpg

没有变化,开始B,一直执行到第5步,数据库数据的变化。

http://img.mukewang.com/climg/5d5667a800011ff406320048.jpg

再执行A中的第6步,数据库没有发生变化。

http://img.mukewang.com/climg/5d56680500018ea106240048.jpg

所以数据发生回滚。

2.读为提交级别(read-uncommitted)

http://img.mukewang.com/climg/5d5672ff00015df811590802.jpg

http://img.mukewang.com/climg/5d5673d200010dcf13980817.jpg

按照上面的顺序a没有提交,但是可以查询到数据发生变化,在b中执行查询语句也可以发生数据的变化。这时b就知道a的操作,就会回滚,a提交即可。

http://img.mukewang.com/climg/5d5675680001377406710044.jpg

除了读未提交级别,其他的三个级别都不可能随时的查看其他任务的事务,所以请同学参考第一种情况.

问题2:

同学可能是使用mysql的最高级别序列化(serializable),这个级别当一个事务未提交时,其他事务必须先等待第一个事务提交之后再进行处理。

问题3:

同学的理解没有问题,要保持原子的一致性。

推荐同学一篇关于隔离性的文章:https://www.cnblogs.com/huanongying/p/7021555.html

如果我解决了同学的问题,请采纳!学习愉快^_^。

0

0 学习 · 2669 问题

查看课程