> While a transaction in one thread tries to update a non-existent InnoDB
> row with a given key value, an attempt to insert that value in another
> thread is locked out. Does anyone know where this behaviour is documented?
> 
> -- connection 1
> drop table if exists t;
> create table t( lockid char(3), lockinfo char(8), primary
> key(lockid,lockinfo) );
> insert into t values('abc','def');
> begin work;
> update t set lockinfo='bar' where lockid='foo';
> 
> -- connection 2:
> insert into t values('aaa','bbb');
> Query OK, 1 row affected (0.00 sec)
> insert into t values('foo','bar'); -- waits for connection 1 transaction


It has to do with transaction isolation levels. I assume REPEATABLE READ by 
default for InnoDB:

http://dev.mysql.com/doc/refman/5.0/en/set-
transaction.html#isolevel_repeatable-read

" 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."
-- 
Rik Wasmus

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/mysql?unsub=arch...@jab.org

Reply via email to