我在我的應用程序中有一個場景,在事務下的簡單INSERT語句阻止了MySQL中不同行上的DELETE語句,並且最終DELETE語句會話超時並出現鎖定超時錯誤。Mysql鎖定等待超時錯誤
我試圖在下面的簡單場景中解釋情況。請注意,在列上添加索引會有所幫助,但是,如果我在DELETE的WHERE子句中有2列,我仍然會看到鎖定等待超時。另請注意,在我開始交易之後,我需要做其他幾個處理,因此交易只需要幾分鐘即可提交或回滾。很難相信,即使我刪除了不同於我試圖插入的記錄,MySQL也會阻止它。
會議1: -
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation;
+-----------------------+----------------+------------------------+
| @@GLOBAL.tx_isolation | @@tx_isolation | @@session.tx_isolation |
+-----------------------+----------------+------------------------+
| READ-COMMITTED | READ-COMMITTED | READ-COMMITTED |
+-----------------------+----------------+------------------------+
1 row in set (0.02 sec)`
mysql> create table testtab(col1 int, col2 int);
Query OK, 0 rows affected (0.53 sec)
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO testtab values(1,1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO testtab values(2,2);
Query OK, 1 row affected (0.00 sec)
會議2: -
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation;
+-----------------------+----------------+------------------------+
| @@GLOBAL.tx_isolation | @@tx_isolation | @@session.tx_isolation |
+-----------------------+----------------+------------------------+
| READ-COMMITTED | READ-COMMITTED | READ-COMMITTED |
+-----------------------+----------------+------------------------+
1 row in set (0.00 sec)
mysql> DELETE FROM testtab where col1=3;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
有什麼建議?
感謝Solarflare。你在現場。 – DBPlayer
爲類似的例子,如果我想看到阻塞查詢(顯示完整的進程列表顯示查詢只會話2),我有什麼選擇。我試過顯示引擎innodb狀態,完整的進程列表等,但似乎沒有向我展示INSERT語句,這實際上導致事務運行時間更長。 – DBPlayer