Hello List,

I discovered an unusual problem with the way Innodb handles the AUTO_INC lock 
with a full table lock. I was wondering if this is a known issue, or I'm doing 
something completely wrong. I'm working with MYSQL Server version: 
5.0.42-debug-log  on Gentoo Linux.

So lets say I have this table:

CREATE TABLE `quicktable` (
  `x` int(11) NOT NULL auto_increment,
  `quicktext` varchar(50) default NULL,
  PRIMARY KEY  (`x`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1



Several connections are inserting concurrently to the table with normal single 
statements such as:

INSERT INTO quicktable (quicktext) VALUES ('Bob 25  item 5');

The value inserted into quicktable changes for every insert to indicate which 
connection and which insert its doing

Now in a unique connection is locking the table using the INNODB suggested 
method:

SET AUTOCOMMIT = 0;
LOCK TABLES quicktable WRITE;

For demonstration purposes this thread sleeps for a second to simulate 
processing that might be going on in the application.
After 1 Second:

COMMIT;
UNLOCK TABLES;
SET AUTOCOMMIT =1;



The result is a dead lock where all queries wait until one of the INSERT's 
times out then the LOCK statement manages to get the table lock. But it happens 
repeatedly with as few as two connections sending inserts. The server can 
handle many many more concurrent inserts if the lock is removed , with out 
resulting in any  locks.

Here is the output of show processlist:
SHOW PROCESSLIST;

+------+------+-----------+------------+---------+------+--------+--------------------------------------------------------+
| Id   | User | Host      | db   | Command | Time | State  | Info               
                                  | 
+------+------+-----------+------------+---------+------+--------+--------------------------------------------------------+
| 1470 | bob | localhost | test | Query   |   19 | update | INSERT INTO 
quicktable (quicktext) VALUES ('Bob 26816  item 5') |
| 1471 | bob | localhost | test | Query   |   19 | Locked | INSERT INTO 
quicktable (quicktext) VALUES ('Bob 6817  item 2') |
| 1472 | bob | localhost | test | Query   |   19 | Locked | LOCK TABLES 
quicktable WRITE                         |
+------+------+-----------+------------+---------+------+--------+------------------------------------------------------+

SHOW INNODB STATUS:
=====================================
071002 16:51:55 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 9 seconds
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 91, signal count 91
Mutex spin waits 0, rounds 0, OS waits 0
RW-shared spins 170, OS waits 85; RW-excl spins 7, OS waits 6
------------------------
LATEST DETECTED DEADLOCK
------------------------
071002 16:51:37
*** (1) TRANSACTION:
TRANSACTION 0 26382727, ACTIVE 0 sec, process no 6820, OS thread id 24264721 
setting table lock
mysql tables in use 1, locked 0
LOCK WAIT 1 lock struct(s), heap size 320
MySQL thread id 1472, query id 24493 localhost bob System lock
LOCK TABLES quicktable WRITE
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
TABLE LOCK table `test/quicktable` trx id 0 26382727 lock mode X waiting
*** (2) TRANSACTION:
TRANSACTION 0 26382726, ACTIVE 0 sec, process no 6819, OS thread id 24248336 
inserting, thread declared inside InnoDB 500
mysql tables in use 1, locked 1
2 lock struct(s), heap size 320
MySQL thread id 1471, query id 24483 localhost bob update
INSERT INTO quicktable (quicktext) VALUES ('Bob 6817 item 37')
*** (2) HOLDS THE LOCK(S):
TABLE LOCK table `test/quicktable` trx id 0 26382726 lock mode AUTO-INC
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
TABLE LOCK table `test/quicktable` trx id 0 26382726 lock mode IX waiting
*** WE ROLL BACK TRANSACTION (2)
------------
TRANSACTIONS
------------
Trx id counter 0 26382734
Purge done for trx's n:o < 0 26382636 undo n:o < 0 0
History list length 39
Total number of lock structs in row lock hash table 0
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 26382731, not started, process no 6818, OS thread id 24231951
mysql tables in use 1, locked 1
MySQL thread id 1470, query id 24519 localhost bob Table lock
INSERT INTO quicktable (quicktext) VALUES (' Bob 6816 item 38')
---TRANSACTION 0 0, not started, process no 3631, OS thread id 17858573
MySQL thread id 1081, query id 7444 localhost bob
---TRANSACTION 0 26375280, not started, process no 2153, OS thread id 16531468
MySQL thread id 1000, query id 24536 localhost bob
show innodb status
---TRANSACTION 0 0, not started, process no 1894, OS thread id 16318475
MySQL thread id 987, query id 1621 localhost bob
---TRANSACTION 0 26382733, ACTIVE 17 sec, process no 6819, OS thread id 
24248336 setting auto-inc lock
mysql tables in use 1, locked 1
LOCK WAIT 1 lock struct(s), heap size 320
MySQL thread id 1471, query id 24507 localhost bob update
INSERT INTO quicktable (quicktext) VALUES ('Bob 6817 item 38')
------- TRX HAS BEEN WAITING 17 SEC FOR THIS LOCK TO BE GRANTED:
TABLE LOCK table `test/quicktable` trx id 0 26382733 lock mode AUTO-INC waiting
------------------
---TRANSACTION 0 26382732, ACTIVE 17 sec, process no 6820, OS thread id 24264721
mysql tables in use 1, locked 1
1 lock struct(s), heap size 320
MySQL thread id 1472, query id 24517 localhost bob Table lock
LOCK TABLES quicktable WRITE
--------
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
754 OS file reads, 14786 OS file writes, 14479 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.56 writes/s, 0.33 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 5, seg size 7,
2 inserts, 2 merged recs, 1 merges
Hash table size 69257, used cells 491, node heap has 2 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
---
LOG
---
Log sequence number 0 3746566754
Log flushed up to   0 3746566754
Last checkpoint at  0 3746566754
0 pending log writes, 0 pending chkp writes
14298 log i/o's done, 0.11 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 36830648; in additional pool allocated 2097152
Buffer pool size   1024
Free buffers       125
Database pages     897
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages read 876, created 21, written 450
0.00 reads/s, 0.00 creates/s, 0.33 writes/s
Buffer pool hit rate 1000 / 1000
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
1 read views open inside InnoDB
Main thread process no. 31444, id 131081, state: waiting for server activity
Number of rows inserted 7054, updated 0, deleted 126, read 589
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================



Does any one know whats going on? Is this expected behavior? 

Thanks in advance,

William







      
____________________________________________________________________________________
Catch up on fall's hot new shows on Yahoo! TV. Watch previews, get listings, 
and more!
http://tv.yahoo.com/collections/3658 

Reply via email to