V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
gongxuanzhang
V2EX  ›  程序员

在一个群里被恶心坏了

  •  5
     
  •   gongxuanzhang · 2024-05-10 16:51:20 +08:00 · 26541 次点击
    这是一个创建于 408 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我在 B 站看到一个微博架构师发的一些视频.觉得他讲的东西很实战,加了他的群,而且是哈尔滨的,我本人是佳木斯的所以对他非常有好感
    今天上午群里在讨论事务隔离级别的问题.
    本身就这一个技术问题大家有着不同的理解很正常,无论说的是对是错我觉得都没啥问题.
    主要是针对 MySQL 的 RR 隔离级别下的幻读问题






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





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

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

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



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

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



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


    我觉得无论我说的是不是对的,技术问题起码应该就事论事,直接开始人身攻击,属实牛
    第 2 条附言  ·  2024-05-13 09:18:23 +08:00
    回复的视频已经贴在上边,
    V 友指出的我说"innodb 没有幻读问题",我说的确实是错的,这点的修正我当时在群里就已经说明,只是没截图出来,这点在视频中提到了,可以去看视频.
    我表达的是我对他"不加锁都是幻读的情况"的质疑.
    如果有兴趣可以去看视频
    161 条回复    2024-05-14 11:09:31 +08:00
    1  2  
    BQsummer
        101
    BQsummer  
       2024-05-11 10:26:06 +08:00
    "普通 Select 无论加不加锁,无论怎么查询都不会有幻读问题,如果 for update 或者 delete update 这种操作就会用临建锁或者间隙锁来保证一致" 原 op 的这句话错的一塌糊涂, 为啥大家关注点不在技术本身
    zhuziyi
        102
    zhuziyi  
       2024-05-11 10:28:14 +08:00
    这类群 99% 都是垃圾消息生产地,想在这种微信群里获得有效有价值的信息太困难。(非公开、小、私群除外)
    sockpuppet9527
        103
    sockpuppet9527  
       2024-05-11 10:59:07 +08:00
    歪下楼,纯讨论技术

    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
        104
    sockpuppet9527  
       2024-05-11 11:05:08 +08:00
    @ucando
    "快照读明明就是有可能发生幻读",我理解这一点上不是绝对。

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

    之前看到有做法把 aoco 的辅助表改到了直接拿个 log-base 的引擎在存,隔离级别在这一层面会失效,且只有 vacuum 发生才会上锁。
    dogfeet
        105
    dogfeet  
       2024-05-11 11:08:11 +08:00
    大家都在说什么啊?是我搞错了吗? rr 应该妥妥的有幻读的问题啊。
    xz410236056
        106
    xz410236056  
       2024-05-11 11:12:05 +08:00
    这些自称什么架构师的,也就骗骗刚毕业的。。不都是卖课、卖教程的吗
    tedzhou1221
        107
    tedzhou1221  
       2024-05-11 11:32:42 +08:00
    @dogfeet 题主说在没有 mvcc 下,rr 有幻读,但 mysql 的 innodb, 有用 mvcc 来解决 幻读问题。
    前面也贴出文章 https://mp.weixin.qq.com/s/K5l6hixzn5K9jWd7shu2GQ
    dogfeet
        108
    dogfeet  
       2024-05-11 11:34:19 +08:00
    @dogfeet 哦,后面有说到只是纯快照读的前提的话
    tangv22ex
        109
    tangv22ex  
       2024-05-11 11:37:30 +08:00
    @gongxuanzhang #23 UP 视频推一下
    WalterHs
        110
    WalterHs  
       2024-05-11 12:39:34 +08:00   ❤️ 2
    突然想起来前几天 Fenng 在推特上跪舔微信本地文件存储,喷那些骂微信的都是傻逼,然后云风大佬亲自做实验,然后再评论区证明 Fenng 说的不对,微信本地文件存储本身确实有问题,结果 Fenng 回了几句眼看要被拆穿直接把云风拉黑了。
    这些人的一贯做法就是这样的,树立自己意见领袖的地位大于一切,消灭一切反对者,真理和事实在这里并不重要。
    ucando
        111
    ucando  
       2024-05-11 12:52:09 +08:00
    @tedzhou1221 文章里也说了 mvcc 并不能解决所有情况的幻读,所以问题其实还在。一般情况下一个事务中是会对某些表做增删改的操作的,那就一定会有当前读的操作,如果仅仅解决快照读的幻读问题,还是不能保证不出问题。反正我做这种操作前一定会加锁,不指望靠这些默认的逻辑来保障数据安全
    ChainLock
        112
    ChainLock  
       2024-05-11 13:30:22 +08:00
    资深技术专家 就是狗屎
    oldking24
        113
    oldking24  
       2024-05-11 13:31:31 +08:00
    mvcc 在 mysql 的可重复读的隔离级别下没有完全的解决幻读问题。有部分当前读会出现幻读的数据。
    rxmt
        114
    rxmt  
       2024-05-11 13:39:09 +08:00
    @watzds 还行吧,op 说的话观点明确,指出错误,没有表达什么额外的情绪,这里本身就是打着“讨论技术”的旗号的,说个问题还得考虑留面子,难为自己么。
    aliyun2017
        115
    aliyun2017  
       2024-05-11 13:52:34 +08:00
    你不会是说姓袁的的吧
    xiaohundun
        116
    xiaohundun  
       2024-05-11 13:57:33 +08:00
    做视频,揭穿他,我帮你点赞,我帮你 at 他,搞他!
    goxxoo
        117
    goxxoo  
       2024-05-11 14:04:19 +08:00
    贫道用 laravel 的开源库也遇到过, 具体哪个就不提了
    louettagfh
        118
    louettagfh  
       2024-05-11 14:09:10 +08:00
    你说的确实不对啊,RR 还是会有幻读的
    lasuar
        119
    lasuar  
       2024-05-11 14:14:35 +08:00
    所以我就没有建立一个 k8s 交流群,都是 issue 或者 email 交流
    angeni
        121
    angeni  
       2024-05-11 14:28:24 +08:00
    和人观点:
    1. 你确实说错了,RR 有幻读。MVCC 解决不了 insert into 带来的幻读问题
    2. 这个架构师技术不论,脾气太大
    lesismal
        122
    lesismal  
       2024-05-11 14:45:17 +08:00
    技术人说话多数都比较直, 一不小心就闹矛盾了
    iCong
        123
    iCong  
       2024-05-11 15:32:47 +08:00
    去架构师的 B 站发了下 v2 的链接被删了。还拉黑了哈哈。
    sdfw23xd
        124
    sdfw23xd  
       2024-05-11 15:36:19 +08:00   ❤️ 1
    我也支持你发个视频反驳他,事不是什么大事,关键是太恶心了。
    shayebushi
        125
    shayebushi  
       2024-05-11 16:11:21 +08:00 via Android   ❤️ 1
    人家洪金宝在佛山是打拳祖师爷,位置稳稳的,你叶问非要去那教拳,这不挑衅吗 不踢你踢谁
    maemolee
        126
    maemolee  
       2024-05-11 16:57:48 +08:00
    @gongxuanzhang #13 支持,不喜欢看到这种 ego 特别大的自媒体,见了恶心。
    ma199385
        127
    ma199385  
       2024-05-11 17:19:33 +08:00


    画了下图,方便理解
    watzds
        128
    watzds  
       2024-05-11 17:25:31 +08:00
    @rxmt #114 哈哈,对喷也行啊,不过自己心态要好,op 自己都恶心坏了,影响自己心情也没意思
    netabare
        129
    netabare  
       2024-05-11 20:24:58 +08:00 via Android
    不愧是 Java 架构师,整天拿着个破锁在那里锁个没完没了的。
    EndlessMemory
        130
    EndlessMemory  
       2024-05-11 20:44:08 +08:00
    你敢质疑他他就给你封了
    AJ1if4
        131
    AJ1if4  
       2024-05-11 23:04:56 +08:00
    @ma199385 点开看不了,能再发一遍吗 谢谢
    Majjx
        132
    Majjx  
       2024-05-11 23:36:46 +08:00
    这要让你说清楚了,还怎么资深,怎么 ga 韭菜,怎么拉人入伙,怎么当领导。有仇发视频,没仇就当没这人
    Lockroach
        133
    Lockroach  
       2024-05-11 23:45:14 +08:00
    看到下面都是夸的你就该知道该跑了
    想当赛博皇帝当的
    hangszhang
        134
    hangszhang  
       2024-05-12 01:02:44 +08:00
    @0xLittleFi #91 这不是幻读,前后两次的 SQL 查询语句都不一样了,幻读的定义是前后查询语句一样
    hangszhang
        135
    hangszhang  
       2024-05-12 01:05:41 +08:00
    @ucando 不是啊,MVCC 解决了当前读的问题呀,假如你第一次查询是快照读,第二次查询是当前读,这都不是同一条 SQL 了,应该不能叫幻读吧
    F281M6Dh8DXpD1g2
        136
    F281M6Dh8DXpD1g2  
       2024-05-12 01:39:55 +08:00 via iPhone
    目测是菜鸡互琢,两个半调子没啥好讨论的
    还有以 mysql 官方文档为依据的一看就是自己没动手验证过,bug 多到你怀疑人生
    ucando
        137
    ucando  
       2024-05-12 01:45:02 +08:00
    @hangszhang 文章里已经说明了 MVCC 下幻读的触发条件了,能让同一事务中的同一条查询 SQL 产生不同的结果。
    A 事务:SELECT * FROM users WHERE AGE > 10 AND AGE <30; 返回 2 条结果。
    B 事务:INSERT INTO users(gmt_create, age, name) values(now(), 20, 'Paidaxing999'); COMMIT;
    A 事务:UPDATE users set name = "Paidaxing888" where age = 20;
    A 事务:SELECT * FROM users WHERE AGE > 10 AND AGE <30; 返回 3 条结果。
    wcnmm
        138
    wcnmm  
       2024-05-12 02:00:36 +08:00
    @luolin0826 语言的艺术啊,确实很厉害。
    hangszhang
        139
    hangszhang  
       2024-05-12 10:28:14 +08:00
    @ucando #137 看明白了,感谢,update 语句把前面 insert 的数据数据读到了当前 session 里面
    ychost
        140
    ychost  
       2024-05-12 10:49:54 +08:00
    已经忘了幻读啥的了,实际生产环境中高并发、大数据很少用 MySQL ,一般高并发就不应该出现复杂业务逻辑
    gongxuanzhang
        141
    gongxuanzhang  
    OP
       2024-05-12 11:36:42 +08:00
    HelloAmadeus
        142
    HelloAmadeus  
       2024-05-12 13:18:12 +08:00 via iPhone
    这连 mvvc 是什么都不知道吧?
    nicoljiang
        143
    nicoljiang  
       2024-05-12 13:32:18 +08:00
    还是支持一下 op ,反对这种技术行业的“官僚”主义。
    ma199385
        144
    ma199385  
       2024-05-12 13:57:17 +08:00 via Android
    @AJ1if4 换个 vpn 节点试试,图没问题
    sloknyyz
        145
    sloknyyz  
       2024-05-13 10:16:10 +08:00
    这种建群的想都不用想就是割韭菜,所有名为技术交流群最后都会沦为吹水群。
    lizy0329
        146
    lizy0329  
       2024-05-13 11:10:59 +08:00
    最小可爱的一种行为就是+所谓的群,有这时间还不如多读读官方文档
    gongxuanzhang
        147
    gongxuanzhang  
    OP
       2024-05-13 11:15:18 +08:00
    @lizy0329 你说的对
    CuChulainn
        148
    CuChulainn  
       2024-05-13 11:27:43 +08:00
    这个架构师不过如此
    hellomsg
        149
    hellomsg  
       2024-05-13 12:12:46 +08:00
    hellomsg
        150
    hellomsg  
       2024-05-13 12:31:08 +08:00
    @zhuisui #42 探讨这类问题确实挺难的,不同时空不同场景,没法一一说明,没有准确答案
    hellomsg
        151
    hellomsg  
       2024-05-13 15:34:19 +08:00
    @sagaxu #66 如果这个作者能光明正大的虚心接受你指出的错误,那更牛了,可惜
    hellomsg
        152
    hellomsg  
       2024-05-13 15:51:05 +08:00
    @lambdaX999 #81 我理解的结论:若欲彻底解决幻读问题,在 InnoDB 中唯一可选的隔离级别是 Serializable (可串行化)级别。
    https://mp.weixin.qq.com/s/K5l6hixzn5K9jWd7shu2GQ
    maemolee
        153
    maemolee  
       2024-05-13 17:00:01 +08:00
    @gongxuanzhang #141 很好,点赞了!
    fionasit007
        154
    fionasit007  
       2024-05-13 17:11:35 +08:00
    shurimasoul
        155
    shurimasoul  
       2024-05-13 17:17:47 +08:00
    支持发视频 diss 他
    Wesson
        156
    Wesson  
       2024-05-13 17:31:23 +08:00
    @NeedI09in 一致性非锁定读,也就是快照读,把头埋进快照里,完全不顾外面天翻覆地的变化,自然发现不了幻象,这不代表解决了幻读,只是你看不见而已。这比幻读更糟糕。
    NeedI09in
        157
    NeedI09in  
       2024-05-13 17:34:09 +08:00
    @Wesson 哈哈哈,有道理。这个解释很有意思,哈哈哈。
    lambdaX999
        158
    lambdaX999  
       2024-05-13 20:57:32 +08:00
    ![]( https://img.erpweb.eu.org/imgs/2024/05/932a103a6951923c.png)

    纯路人,对双方都没有恶意,OP 能出个视频来详细的分析下这个问题吗?我看 B 站下面很多粉丝说 OP 不懂
    gongxuanzhang
        159
    gongxuanzhang  
    OP
       2024-05-13 22:33:20 +08:00
    @lambdaX999 我 append 的视频中有部分提到,没有完整说明,但是我觉得足够解释了
    dolorain
        160
    dolorain  
       2024-05-14 09:33:13 +08:00
    @gongxuanzhang 视频看过了,支持 UP 主
    gongxuanzhang
        161
    gongxuanzhang  
    OP
       2024-05-14 11:09:31 +08:00
    @dolorain 感谢支持,不要骂人就好
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   858 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:01 · PVG 06:01 · LAX 15:01 · JFK 18:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.