David,

next-key locks are purely inhibitive. Even though transaction (2) has an
X-lock on the 'supremum' of the index, it cannot insert because also
transaction (1) has an X-lock on the 'supremum'.

Why is it allowed that two transactions can both have an X-lock on a 'gap'
in the index (the supremum is a special case of a gap)? We have to allow it
because purge may remove records from the index, and two gaps can merge.

In this specific case, the cursor of transaction (1) has already passed the
place where transaction (2) is trying to insert. If we would allow (2) to do
the insert, then the cursor of (1) should be more intelligent than it is
now. It should look back at the inserted record, and check if it is in the
result set the cursor is trying to read.

Best regards,

Heikki
Innobase Oy
InnoDB - transactions, row level locking, and foreign keys for MySQL
InnoDB Hot Backup - a hot backup tool for InnoDB which also backs up MyISAM
tables
http://www.innodb.com/order.php

Order MySQL support from http://www.mysql.com/support/index.html


...........
From: David Edwards ([EMAIL PROTECTED])
Subject: Re: InnoDB deadlock problem
View: Complete Thread (3 articles)
Original Format
Newsgroups: mailing.database.myodbc
Date: 2004-10-07 04:11:35 PST

--0-1154760343-1097147469=:85242
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

Hi Tobias,

Thanks for your reply. Unfortunately I couldn't see from the manual why I
was getting the deadlock - transaction 2 already has a lock on the index it
is waiting for. The difference seems to be 'insert intention' - I'm not sure
what different types of exclusive lock there are and how they relate to each
other. Is there any way I can get both types of lock in one go, in the first
statement I execute?

Thanks,
David

Tobias Asplund <[EMAIL PROTECTED]> wrote:
On Wed, 6 Oct 2004, David Edwards wrote:

> I've got a deadlock problem using InnoDB tables

(...)

> Transaction 1:
> START TRANSACTION;
> DELETE FROM results WHERE id_job = 25920;
> INSERT INTO results(result,id_job) VALUES (31.461937,25920);
> COMMIT;
>
> Transaction 2:
> START TRANSACTION;
> DELETE FROM results WHERE id_job = 25919;
> INSERT INTO results(result,id_job) VALUES
(25.388607,25919),(22.650234,25919);
> COMMIT;

I think this manual page might explain what's happening:

http://dev.mysql.com/doc/mysql/en/InnoDB_Next-key_locking.html


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to