Re: Problem with InnoDB locks

Harrison Fisk <[email protected]> Mon, 14 Mar 2005 23:45:29 -0500
Newsgroups gmane.comp.db.mysql.bugs
Message-ID <[email protected]>
Hi,

I don't believe the following is a bug.  I will explain the behavior 
below.

On Mar 14, 2005, at 3:35 PM, Miguel Angel Solorzano wrote:

> At 13:54 14/3/2005, K.V.Suresh wrote:
> Dear Suresh,
>
> Could you please file a bug report at:
>
> http://bugs.mysql.com
>
> Thanks in advance.
>
>> Hi,
>>
>> I'm running MySQL 4.0.20 in Windows and face the
>> following problem with InnoDB.
>>
>> First create two tables
>> CREATE TABLE test (
>>   ID INTEGER NOT NULL,
>>   name varchar(100) ,
>>   PRIMARY KEY  (ID)
>> ) TYPE=InnoDB
>>
>> create table test1 (ID INTEGER NOT NULL , ID1 INTEGER
>> NOT NULL,
>> PRIMARY KEY(ID,ID1),
>> FOREIGN KEY(ID) REFERENCES TEST(ID))
>> type = InnoDB;
>>
>> insert into test values (1,'abc');
>> insert into test values (2,'def');
>>
>> insert into test1 values (1,1);
>> insert into test1 values (2,1);
>>
>> commit;
>>
>> now from one Transaction (say T1) do the following
>>
>> insert into test1 values(2,3);

When you perform this insert you set a shared row level lock the parent 
row in table 'test' because of the FOREIGN KEY constraint.  The reason 
this has to occur is to be able to guarantee that the row is still 
present in the parent table when you do a commit statement.  I believe 
this behavior is fairly standard with most DBMS that don't do 
deferrable constraints, as I know that PostgreSQL does the same thing 
(but with an exclusive row level lock on the parent).

>>
>> and another transaction (say T2):
>> update test set name='ghi' where ID=2;

Now you are trying to update the parent row which requires an exclusive 
lock.  The other transaction has a shared-lock so you can imagine it 
has to block and wait.  InnoDB doesn't do column level locking (nor do 
any other database engines) so it doesn't know that you are only 
changing the column which doesn't matter due to the previous lock.

>>
>> The T2 is waiting on lock! I don't really understand
>> this behavior. The two transaction are involving
>> different tables and the index column is not 'updated'
>> in T2, so why this lock? Can someone please throw some
>> light on this behavior? or is this a bug in the InnoDB
>> locking mechanism?
>>
>> Regards,
>> Suresh.K.V.

I hope that helps to explain the behavior you saw and why it is occurs.

Regards,

Harrison

-- 
Harrison C. Fisk, Trainer and Consultant
MySQL AB, www.mysql.com

Get a jumpstart on MySQL Cluster -- 
http://www.mysql.com/consulting/packaged/cluster.html


-- 
MySQL Bugs Mailing List
For list archives: http://lists.mysql.com/bugs
To unsubscribe:    http://lists.mysql.com/[email protected]