有没有文章直接指出 MYSQL 四个隔离级别(特别中间两个)下到底怎么上锁,上什么锁的?什么不可重复读,幻读乱七八糟的

2020-03-24 18:20:13 +08:00
 Newyorkcity
事务 t1 从用户表查 id=101 的人名字,得到张三。事务 t2 这时候在并发的做事,可能把 id=101 的人名字改王五了。t2 提交了之后。t1 再查,id=101 的人的名字变王五了。这是不可重复读,是不是幻读?

怎么避免这样的上述的不可重复读呢?我读到的记录,就给它加把排斥写锁的读锁,这样别的事务就改不了它(事务要改记录必须给记录加上写锁的前提下)。不可重复读就问题就解决了

吗?

按照上面说的加锁方式,事务 t1 上来查了下用户表里叫李四的有多少个,一查,2 个。事务 t2 与 t1 并发呢,随后插入了一个新的名为李四的用户的记录,提交了。t1 再一查叫李四的几个人,3 个了。这不算不可重复读吗?为什么啊?算幻读吗?为什么啊?

那隔离级别里的『可重复读』,是上述两个问题都解决了,还是只解决了第一个问题?解决方法和我说的一样吗?

============

所以我真的头大,有没有什么官方文档干脆利落地说清楚,MYSQL 5.7 InnoDB 到底在这两种隔离级别下怎么上锁,上的什么锁。

谢谢
2866 次点击
所在节点    MySQL
11 条回复
fantastM
2020-03-24 18:29:13 +08:00
http://hedengcheng.com/?p=771 这是原文,但图片已经失效了,可以看些转载的文章
ylsc633
2020-03-24 19:16:31 +08:00
MVCC 和 Next-Key Locks


我抛出一个疑问! 仅仅 mvcc 能解决 mysql 的 幻读的问题吗?

有答案,请艾特我
EmdeBoas
2020-03-24 19:19:46 +08:00
如果只是想搞清楚相关概念,我建议直接读 ANSI 标准,各类主流数据库在实现的时候都会遵循,也避免掉到具体数据库的实现细节中去:
https://wiki.hsr.ch/Datenbanken/files/Paper_ANSI_SQL_Isolation_Levels_Stefan_Luetolf_V2_1.pdf

一篇老而经典的论文:A Critique of ANSI SQL Isolation Levels,里面有指出了 ANSI 标准一些容易让人误解的场景

认真读完这两个东西,理解会很深刻
lu5je0
2020-03-24 19:23:26 +08:00
@ylsc633 仅有 mvcc 不能解决当前读下的幻读问题
silencil
2020-03-24 19:36:57 +08:00
推荐掘金上讲 MySQL 的那本小册,看完绝对不乱。
mawerss1
2020-03-24 19:41:40 +08:00
@fantastM 刚想说这篇来着,非常清晰,网上可以搜到转发的,有图片,但是没保留原作者,经典文章,已保存
noobsheldon
2020-03-24 19:42:55 +08:00
mawerss1
2020-03-24 19:44:21 +08:00
@ylsc633 仅仅 mvcc 是说不加读写锁? 我说一个用乐观锁解决,不知道对不对
Newyorkcity
2020-03-25 11:30:01 +08:00
@fantastM
@mawerss1
两位,这篇文章里说 RR 级别不存在幻读?在网页里搜索『不存在幻读现象。』可以定位到原文...这...几乎和常识违背了啊
mawerss1
2020-03-25 15:05:25 +08:00
@Newyorkcity 当前读的前提下,是不存在幻读的,没有错
mogami18
2020-07-28 02:47:56 +08:00
@EmdeBoas 巧了,前不久我刚刚也读了两篇 paper,其中一篇和老兄你推荐的一样。
Distributed snapshot isolation: global transactions pay globally, local transactions pay locally
https://dl.acm.org/doi/10.1007/s00778-014-0359-9
A Critique of ANSI SQL Isolation Levels
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-95-51.pdf

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/655784

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX