zxCoder
V2EX  ›  问与答

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

  •  
  •   zxCoder · Feb 5, 2021 · 1736 views
    This topic created in 1960 days ago, the information mentioned may be changed or developed.

    没查到相关资料

    是我理解错了吗

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

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

    4 replies    2021-02-06 19:15:15 +08:00
    louettagfh
        1
    louettagfh  
       Feb 6, 2021
    你是指没有显式的 begin 吗?

    update 语句依然需要排它锁.

    事务中写不写 FOR UPDATE 和 LOCK IN SHARE MODE 取决于你的需求啊.
    zxCoder
        2
    zxCoder  
    OP
       Feb 6, 2021
    @louettagfh 对 就是没有显式的开启事务,这时候 update 会自动当做一个事务吗?
    所以事务中其实是不会自动加锁的吗?必须自己手动显式加锁?(对于 innodb )
    lizuoqiang
        3
    lizuoqiang  
       Feb 6, 2021
    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  
       Feb 6, 2021
    @zxCoder 针对 SELECT 当然是取决于你的语句来决定加什么锁.

    Update 即修改 record 是自动加锁的, 你不需要做任何处理.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2559 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 08:05 · PVG 16:05 · LAX 01:05 · JFK 04:05
    ♥ Do have faith in what you're doing.