V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zxCoder
V2EX  ›  问与答

mysql 里 非事务的 update 语句,会自动加排它锁吗

  •  
  •   zxCoder · 2021-02-05 23:39:48 +08:00 · 1284 次点击
    这是一个创建于 1385 天前的主题,其中的信息可能已经有所发展或是发生改变。

    没查到相关资料

    是我理解错了吗

    大多数书 教程都说的是事务的情况

    然后在事务中,到底要不要手动写 FOR UPDATE 或 LOCK IN SHARE MODE 来加锁呢?还是说 mysql 会自动根据查询语句的类别来加锁?

    4 条回复    2021-02-06 19:15:15 +08:00
    louettagfh
        1
    louettagfh  
       2021-02-06 09:40:49 +08:00
    你是指没有显式的 begin 吗?

    update 语句依然需要排它锁.

    事务中写不写 FOR UPDATE 和 LOCK IN SHARE MODE 取决于你的需求啊.
    zxCoder
        2
    zxCoder  
    OP
       2021-02-06 09:59:32 +08:00
    @louettagfh 对 就是没有显式的开启事务,这时候 update 会自动当做一个事务吗?
    所以事务中其实是不会自动加锁的吗?必须自己手动显式加锁?(对于 innodb )
    lizuoqiang
        3
    lizuoqiang  
       2021-02-06 11:42:59 +08:00
    session 1:
    #关闭自动提交
    set autocommit = 'OFF';
    #更新一条记录
    update author set name = 'first_new' where id = 1;

    session 2:
    #关闭自动提交
    set autocommit = 'OFF';
    #更新一条记录
    update author set name = 'first_new_2' where id = 1;

    session2 会等待 session1 的锁释放而导致超时

    所以一般的事物不需要显示的加锁
    louettagfh
        4
    louettagfh  
       2021-02-06 19:15:15 +08:00
    @zxCoder 针对 SELECT 当然是取决于你的语句来决定加什么锁.

    Update 即修改 record 是自动加锁的, 你不需要做任何处理.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5256 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 07:18 · PVG 15:18 · LAX 23:18 · JFK 02:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.