I've been getting the following error in my Python program which accesses InnoDB tables:

OperationalError: 1213 Deadlock found when trying to get lock; try restarting transaction

I've already tried all the basic steps that the documentation seems to recommend:

- Set my TRANSACTION ISOLATION LEVEL to READ UNCOMMITTED for session and globally
- used "UPDATE LOW PRIORITY" to encourage waiting for locks to become clear
- COMMIT immediately before the UPDATE to drop all locks


What's puzzling is that this deadlock requires *three* active clients to manifest. Two of these clients can hit the server without problems, but if that number is increased only two active clients remain deadlock-free. Any hints or suggestions for further reading would be appreciated.

Here's what I get from SHOW INNODB STATUS after a deadlock. What's especially puzzling is that what I'm seeing seems to violate the very definition of deadlock. Transaction 1 is holding no locks (since it just committed) and is attempting to acquire a lock on only one row of one table for an update. You need at least two locks to create circularity.

----------------------------------------------------------------------
=====================================
050427 12:31:50 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 9 seconds
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 96, signal count 93
Mutex spin waits 657, rounds 8130, OS waits 31
RW-shared spins 83, OS waits 37; RW-excl spins 40, OS waits 28
------------------------
LATEST DETECTED DEADLOCK
------------------------
050427 12:31:37
*** (1) TRANSACTION:
TRANSACTION 0 23662, ACTIVE 1 sec, OS thread id 25389056 updating or deleting
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1024, undo log entries 1
MySQL thread id 326, query id 13839 localhost sherman Updating
UPDATE LOW_PRIORITY frames SET frame_state="run" WHERE frame_jid=9 AND frame_lid=0 AND frame_frame=2 AND frame_tile=6 AND frame_state="ready"
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 393 n bits 648 index `frame_state_key` of table `sherman/frames` trx id 0 23662 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 577 PHYSICAL RECORD: n_fields 5; 1-byte offs TRUE; info bits 32
0: len 1; hex 04; asc ;; 1: len 4; hex 0000002f; asc /;; 2: len 1; hex 00; asc ;; 3: len 2; hex 0010; asc ;; 4: len 1; hex 00; asc ;;


*** (2) TRANSACTION:
TRANSACTION 0 23665, ACTIVE 0 sec, OS thread id 25530880 fetching rows, thread declared inside InnoDB 283
mysql tables in use 1, locked 1
17 lock struct(s), heap size 2496
MySQL thread id 328, query id 13853 localhost sherman Copying to tmp table
CREATE TEMPORARY TABLE t_active_layers (PRIMARY KEY(tal_jid,tal_lid)) SELECT DISTINCT frame_jid as tal_jid, frame_lid as tal_lid FROM frames WHERE frame_state="ready"
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 393 n bits 648 index `frame_state_key` of table `sherman/frames` trx id 0 23665 lock mode S
Record lock, heap no 577 PHYSICAL RECORD: n_fields 5; 1-byte offs TRUE; info bits 32
0: len 1; hex 04; asc ;; 1: len 4; hex 0000002f; asc /;; 2: len 1; hex 00; asc ;; 3: len 2; hex 0010; asc ;; 4: len 1; hex 00; asc ;;


*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 1717 n bits 864 index `frame_state_key` of table `sherman/frames` trx id 0 23665 lock mode S waiting
Record lock, heap no 78 PHYSICAL RECORD: n_fields 5; 1-byte offs TRUE; info bits 32
0: len 1; hex 03; asc ;; 1: len 4; hex 00000009; asc ;; 2: len 1; hex 00; asc ;; 3: len 2; hex 0002; asc ;; 4: len 1; hex 06; asc ;;


*** WE ROLL BACK TRANSACTION (2)
------------
TRANSACTIONS
------------
Trx id counter 0 23695
Purge done for trx's n:o < 0 23695 undo n:o < 0 0
History list length 31
Total number of lock structs in row lock hash table 0
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, OS thread id 25577472
MySQL thread id 330, query id 13958 localhost soren
SHOW INNODB STATUS
---TRANSACTION 0 23661, not started, OS thread id 25566208
MySQL thread id 329, query id 13852 localhost sherman
---TRANSACTION 0 23665, not started, OS thread id 25530880
MySQL thread id 328, query id 13853 localhost sherman
--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (write thread)
Pending normal aio reads: 0, aio writes: 0,
ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
45 OS file reads, 2582 OS file writes, 1804 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 2.22 writes/s, 0.67 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf for space 0: size 1, free list len 0, seg size 2, is empty
Ibuf for space 0: size 1, free list len 0, seg size 2,
0 inserts, 0 merged recs, 0 merges
Hash table size 34679, used cells 15981, node heap has 22 buffer(s)
0.89 hash searches/s, 2.89 non-hash searches/s
---
LOG
---
Log sequence number 0 106306834
Log flushed up to   0 106306834
Last checkpoint at  0 106306834
0 pending log writes, 0 pending chkp writes
1673 log i/o's done, 0.22 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 18368350; in additional pool allocated 1046784
Buffer pool size   512
Free buffers       27
Database pages     463
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages read 52, created 411, written 2038
0.00 reads/s, 0.00 creates/s, 2.22 writes/s
Buffer pool hit rate 1000 / 1000
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
Main thread id 25323008, state: waiting for server activity
Number of rows inserted 97284, updated 52406, deleted 267, read 6584134
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================


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



Reply via email to