MySQL入門學習之——mysql與oracle死鎖對比

wxjzqym發表於2015-09-03
Oracle死鎖:
0.構建測試資料
SQL> select * from t;

        ID NAME
---------- ----------
         1 a         
         2 b       

1.會話1更新第一行資料
SQL> update t set name='A1' where id=1;
已更新 1 行。

2.會話2更新第二行資料
SQL> update t set name='B2' where id=2;
已更新 1 行。                                                         

3.會話1更新第二行資料
SQL> update t set name='B2' where id=2;
。。
。。
Note:操作被阻塞

4.會話2更新第一行資料
SQL> update t set name='A1' where id=1;
。。。
。。。
Note:操作被阻塞

5.等待若干秒後觀察會話1
SQL> update t set name='B2' where id=2;
update t set name='B2' where id=2      
       *                         
第 1 行出現錯誤:                                                                                                                                                       
ORA-00060: 等待資源時檢測到死鎖
Note:Oracle檢測到死鎖

6.等待若干秒後觀察會話2
SQL> update t set name='A1' where id=1;
。。。
。。。
Note:操作扔被阻塞

7.在會話1執行回滾操作
SQL> rollback;
回退已完成。

8.繼續觀察會話2
SQL> update t set name='A1' where id=1;
已更新 1 行。 
Note:之前的被阻塞的update成功執行!




Mysql死鎖:
0.構建測試環境
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

or

mysql> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
1 row in set (0.00 sec)

mysql> select * from t;
+------+----------+
| id   | name     |
+------+----------+
|   38 | shanghai |
|  100 | tl       |
|  250 | boston2  |
| 4000 | jack     |
+------+----------+

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

1.會話1更新一行資料
mysql> update t set name='tl2' where id=100;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

2.會話2更新另一行資料
mysql> update t set name='boss' where id=250;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

3.會話1更新會話2同一行資料
mysql> update t set name='boss' where id=250;
Query OK, 1 row affected (5.67 sec)
。。。
。。。
Note:操作被阻塞

4.會話2更新會話1同一行資料
mysql> update t set name='tl2' where id=100;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
Note:Mysql檢測到死鎖並自動回滾該事物

5.觀察會話1
mysql> update t set name='boss' where id=250;
Query OK, 1 row affected (5.67 sec)
Rows matched: 1  Changed: 1  Warnings: 0
Note:阻塞現象消失,操作被正常執行

6.會話1手動提交事物
mysql> commit;
Query OK, 0 rows affected (0.00 sec)


總結:
1.Oracle中死鎖資訊會在第1個被阻塞的會話中被檢測出來,這時需要在該會話中手動回滾事物,第二個被阻塞的會話恢復正常,然後手動提交事物即可。

2.在Mysql中無論隔離級別是REPEATABLE-READ還是READ-COMMITTED現象都是一樣的,Mysql中的死鎖資訊會在第二個被阻塞的會話中被檢測出來,
該回話中的事務會自動回滾,第一個被阻塞的會話恢復正常,這時只需要在該會話中手動提交事物即可。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20801486/viewspace-1790053/,如需轉載,請註明出處,否則將追究法律責任。

相關文章