在一个群里被恶心坏了

228 天前
 gongxuanzhang
我在 B 站看到一个微博架构师发的一些视频.觉得他讲的东西很实战,加了他的群,而且是哈尔滨的,我本人是佳木斯的所以对他非常有好感
今天上午群里在讨论事务隔离级别的问题.
本身就这一个技术问题大家有着不同的理解很正常,无论说的是对是错我觉得都没啥问题.
主要是针对 MySQL 的 RR 隔离级别下的幻读问题






这时候他表示没有锁就是幻读,还表示 Java 的锁就没学明白,我表达快照读就算不加锁同样没有幻读问题,除非你在事务里面修改了其他事务新增的数据,那就没办法了





然后就开始攻击我了,说官方文档写的清楚.

然后我去 MySQL 官方看,同时自己做了验证,我的理解是普通 Select 无论加不加锁,无论怎么查询都不会有幻读问题,如果 for update 或者 delete update 这种操作就会用临建锁或者间隙锁来保证一致.
所以他的结论"不加锁都是幻读" 就是不对的

还上升到 java 的锁,CopyOnWirteArrayList 不就是快照实现吗? 一个快照迭代器创建之后就是不会被其他线程影响啊,难道迭代器不加锁要被 add 影响吗? 无锁保证数据一致的方法多了,JcTool 里面好多队列都是



当我想把官方这个截图贴到群里的时候,我就已经被踢了. 我巨无语,一个资深技术专家可以这么讨论问题的.

然后我去 B 站质问他,果不其然 B 站也把我拉黑了



这就是架构师的格局吗 开了眼了


我觉得无论我说的是不是对的,技术问题起码应该就事论事,直接开始人身攻击,属实牛
24315 次点击
所在节点    程序员
161 条回复
BQsummer
227 天前
"普通 Select 无论加不加锁,无论怎么查询都不会有幻读问题,如果 for update 或者 delete update 这种操作就会用临建锁或者间隙锁来保证一致" 原 op 的这句话错的一塌糊涂, 为啥大家关注点不在技术本身
zhuziyi
227 天前
这类群 99% 都是垃圾消息生产地,想在这种微信群里获得有效有价值的信息太困难。(非公开、小、私群除外)
sockpuppet9527
227 天前
歪下楼,纯讨论技术

1. 首先“幻读”是否一定要加锁?
我的答案是:否,完全可以以空间换时间来解决"幻读"的问题。拿 pg 举例,xlog 中记录了每一条 insert/update/delete 语句且带有了 xmin/xmax/tid ,假设我们不存在 heap 表,将数据只存在 xlog 中,那么同一个事务只需要去扫当前 tid 事务 id 命中的 xlog 进行还原就行,这个时候是无需锁的,因为 xlog 中不会做 in-place update/delete 。

像现在的 [neon db]( https://github.com/neondatabase/neon) 做法是类似的。

2. mysql 中“幻读”是否一定要加锁?
不了解 mysql ,不知道
sockpuppet9527
227 天前
@ucando
"快照读明明就是有可能发生幻读",我理解这一点上不是绝对。

pg 有些存储插件的做法是把数据本身做成不可改的,比如 gp 的 aoco ,对于 aoco 来说快照读只发生在辅助表内,也就是读 heap 表的部分,这部分发不发生幻读,取决于隔离级别的。

之前看到有做法把 aoco 的辅助表改到了直接拿个 log-base 的引擎在存,隔离级别在这一层面会失效,且只有 vacuum 发生才会上锁。
dogfeet
227 天前
大家都在说什么啊?是我搞错了吗? rr 应该妥妥的有幻读的问题啊。
xz410236056
227 天前
这些自称什么架构师的,也就骗骗刚毕业的。。不都是卖课、卖教程的吗
tedzhou1221
227 天前
@dogfeet 题主说在没有 mvcc 下,rr 有幻读,但 mysql 的 innodb, 有用 mvcc 来解决 幻读问题。
前面也贴出文章 https://mp.weixin.qq.com/s/K5l6hixzn5K9jWd7shu2GQ
dogfeet
227 天前
@dogfeet 哦,后面有说到只是纯快照读的前提的话
tangv22ex
227 天前
@gongxuanzhang #23 UP 视频推一下
WalterHs
227 天前
突然想起来前几天 Fenng 在推特上跪舔微信本地文件存储,喷那些骂微信的都是傻逼,然后云风大佬亲自做实验,然后再评论区证明 Fenng 说的不对,微信本地文件存储本身确实有问题,结果 Fenng 回了几句眼看要被拆穿直接把云风拉黑了。
这些人的一贯做法就是这样的,树立自己意见领袖的地位大于一切,消灭一切反对者,真理和事实在这里并不重要。
ucando
227 天前
@tedzhou1221 文章里也说了 mvcc 并不能解决所有情况的幻读,所以问题其实还在。一般情况下一个事务中是会对某些表做增删改的操作的,那就一定会有当前读的操作,如果仅仅解决快照读的幻读问题,还是不能保证不出问题。反正我做这种操作前一定会加锁,不指望靠这些默认的逻辑来保障数据安全
ChainLock
227 天前
资深技术专家 就是狗屎
oldking24
227 天前
mvcc 在 mysql 的可重复读的隔离级别下没有完全的解决幻读问题。有部分当前读会出现幻读的数据。
rxmt
227 天前
@watzds 还行吧,op 说的话观点明确,指出错误,没有表达什么额外的情绪,这里本身就是打着“讨论技术”的旗号的,说个问题还得考虑留面子,难为自己么。
aliyun2017
227 天前
你不会是说姓袁的的吧
xiaohundun
227 天前
做视频,揭穿他,我帮你点赞,我帮你 at 他,搞他!
goxxoo
227 天前
贫道用 laravel 的开源库也遇到过, 具体哪个就不提了
louettagfh
227 天前
你说的确实不对啊,RR 还是会有幻读的
lasuar
227 天前
所以我就没有建立一个 k8s 交流群,都是 issue 或者 email 交流
iCong
227 天前

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

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

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

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

© 2021 V2EX