InnoDB SELECT … FOR UPDATE statement locking all rows in a table

前端 未结 3 1972
無奈伤痛
無奈伤痛 2021-02-04 14:24

MySQL Server version 5.1.41 with InnoDB plugin enabled. I have the following three tables for invoices: invoices, invoice_components and invoice_expenses. Table invoices has inv

3条回答
  •  感情败类
    2021-02-04 14:56

    I suspect it has to do with gap locks and next-key locks and the differences in the behaviour of REPEATABLE READ :

    The excerpts are from MySQL docs: SET TRANSACTION syntax

    For locking reads (SELECT with FOR UPDATE or LOCK IN SHARE MODE), UPDATE, and DELETE statements, locking depends on whether the statement uses a unique index with a unique search condition, or a range-type search condition. For a unique index with a unique search condition, InnoDB locks only the index record found, not the gap before it. For other search conditions, InnoDB locks the index range scanned, using gap locks or next-key (gap plus index-record) locks to block insertions by other sessions into the gaps covered by the range.

    and READ COMMITTED :

    Note: In MySQL 5.1, if the READ COMMITTED isolation level is used or the innodb_locks_unsafe_for_binlog system variable is enabled, there is no InnoDB gap locking except for foreign-key constraint checking and duplicate-key checking. Also, record locks for nonmatching rows are released after MySQL has evaluated the WHERE condition.

    Perhaps OP can tell us the status of innodb_locks_unsafe_for_binlog system variable and if the same locking occurs when this variable's setting is changed.

    Also, if same locking happens with not sequential ids, like 18 and 20, or 18 and 99

提交回复
热议问题