MYSQL死鎖案例
01 下列的例子演示當鎖定請求可能會導致死鎖之時一個錯誤會如何發生。例子中包括兩個客戶端A和B。 02 03 首先客戶端A創建一個包含一個行的表,然後開始一個事務。在這個事務內,A通過在共享模式選擇行獲得對行的S 鎖定: 04 05 mysql> CREATE TABLE t (i INT) ENGINE = InnoDB; 06 07 Query OK, 0 rows affected (1.07 sec) 08 09 10 11 mysql> INSERT INTO t (i) VALUES(1); 12 13 Query OK, 1 row affected (0.09 sec) 14 15 16 17 mysql> START TRANSACTION; 18 19 Query OK, 0 rows affected (0.00 sec) 20 21 22 23 mysql> SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE; 24 25 +------+ 26 27 | i | 28 29 +------+ 30 31 | 1 | 32 33 +------+ 34 35 1 row in set (0.10 sec) 36 37 接著,客戶端B開始一個事務並嘗試從該表刪除行: 38 39 mysql> START TRANSACTION; 40 41 Query OK, 0 rows affected (0.00 sec) 42 43 44 45 mysql> DELETE FROM t WHERE i = 1; 46 47 刪除操作要求一個X 鎖定。因為這個鎖定不兼容客戶端A持有的S鎖定,所以X 鎖定不被允許,所以請求進入對行及客戶端阻擋的鎖定請求隊列。 48 49 最後,客戶端A也試圖從表中刪除該行: 50 51 mysql> DELETE FROM t WHERE i = 1; 52 53 ERROR 1213 (40001): Deadlock found when trying to get lock; 54 55 try restarting transaction