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
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