mysql与oracle锁区别_MySQL入门学习之——mysql与oracle死锁对比

本文通过构建测试数据,对比分析了Oracle和MySQL在死锁情况下的处理方式。在Oracle中,死锁信息在第一个被阻塞的会话中显示,需要手动回滚事务以解除死锁;而在MySQL中,无论隔离级别如何,第二个被阻塞的事务会被自动回滚,然后只需提交剩余事务。
摘要由CSDN通过智能技术生成

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值