V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gongxuanzhang
V2EX  ›  程序员

在一个群里被恶心坏了

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






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





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

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

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



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

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



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


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

    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  
       196 天前
    @ucando
    "快照读明明就是有可能发生幻读",我理解这一点上不是绝对。

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

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


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

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