程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MYSQL死鎖案例

MYSQL死鎖案例

編輯:MySQL綜合教程

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

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved