Re: Problem with InnoDB locks
"K.V.Suresh" <[email protected]> Tue, 15 Mar 2005 07:11:53 +0000 (GMT)
| Newsgroups | gmane.comp.db.mysql.bugs |
|---|---|
| Message-ID | <[email protected]> |
Dear Harrison, Thanks a lot for your detailed explanation. I now understand (and appreciate!) this behavior of InnoDB engine. In fact, I should've read the "Locks Set by Different SQL Statements in InnoDB" document before sending this post! This clearly states the following: ... If a FOREIGN KEY constraint is defined on a table, any insert, update, or delete that requires checking of the constraint condition sets shared record-level locks on the records it looks at to check the constraint. InnoDB also sets these locks in the case where the constraint fails. ... http://dev.mysql.com/doc/mysql/en/innodb-locks-set.html Thanks, Suresh.K.V. --- Harrison Fisk <[email protected]> wrote: > 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] > > Send instant messages to your online friends http://uk.messenger.yahoo.com -- MySQL Bugs Mailing List For list archives: http://lists.mysql.com/bugs To unsubscribe: http://lists.mysql.com/[email protected]