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中的死锁信息会在第二个被阻塞的会话中被检测出来,
该回话中的事务会自动回滚,第一个被阻塞的会话恢复正常,这时只需要在该会话中手动提交事物即可。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20801486/viewspace-1790053/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20801486/viewspace-1790053/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值