MySQL入門學習之——mysql與oracle死鎖對比
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中的死鎖資訊會在第二個被阻塞的會話中被檢測出來,
該回話中的事務會自動回滾,第一個被阻塞的會話恢復正常,這時只需要在該會話中手動提交事物即可。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL和Oracle對比學習之事務MySqlOracle
- MySQL入門學習之——innodb lockMySql
- 與MSSQL對比學習MYSQL的心得MySql
- 【MySQL】死鎖案例之六MySql
- 【MySQL】死鎖案例之七MySql
- 【MySQL】死鎖案例之八MySql
- 【MySQL】死鎖案例之四MySql
- MySQL入門--事務與鎖MySql
- MySQL的double write和Oracle對比學習MySqlOracle
- MySQL入門學習之——實戰XtraBackupMySql
- MySQL入門學習之——實戰mysqldumpMySql
- 【Mysql學習】mysql的使用入門MySql
- 【Mysql 學習】mysql 的使用入門MySql
- MySQL入門學習之——MySQL錯誤解決彙總MySql
- MySQL入門學習之——原始碼安裝mysql5.5MySql原始碼
- MySQL鎖等待與死鎖問題分析MySql
- MySQL和Oracle對比學習之資料字典後設資料MySqlOracle
- MYSQL引擎的鎖對比MySql
- MySQL學習之全域性鎖和表鎖MySql
- MySQL死鎖分析與解決之路MySql
- MySQL 死鎖與日誌二三事MySql
- MySQL 死鎖和鎖等待MySql
- MySQL 死鎖解決MySql
- MySQL死鎖問題MySql
- 【MySQL】漫談死鎖MySql
- MySQL解決死鎖MySql
- MySQL學習之行鎖MySql
- MySQL學習筆記---入門使用MySql筆記
- mysql 基礎命令入門學習MySql
- MySQL死鎖系列-線上死鎖問題排查思路MySql
- MySQL和Oracle對比之儲存過程MySqlOracle儲存過程
- mysql行鎖和死鎖檢測MySql
- Mysql 兩階段鎖和死鎖MySql
- MySQL 死鎖問題分析MySql
- MySQL:死鎖一例MySql
- Mysql如何處理死鎖MySql
- MySQL:MTS和mysqldump死鎖MySql
- MySQL列印死鎖日誌MySql