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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/20801486/viewspace-1790053/