mysql死锁问题

采用的是5.6版本的mysql数据库,事务隔离级别是默认的RR(Repeatable-Read),采用innodb引擎。假设存在test表:

CREATE TABLE `test` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `a` int(11) unsigned DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `a` (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8;

表的结构很简单,一个主键id,另一个唯一索引a。表里的数据如下:

    mysql> select * from test;
    +----+------+
    | id | a    |
    +----+------+
    |  1 |    1 |
    |  2 |    2 |
    |  4 |    4 |
    +----+------+
    3 rows in set (0.00 sec)

出现死锁的操作如下:

步骤 事务1 事务2
1 begin
2 delete from test where a = 2;
3 begin
4 delete from test where a = 2; (事务1卡住)
5 提示出现死锁:ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction insert into test (id, a) values (10, 2);

原文链接:http://www.kissyu.org/2017/02...

为什么事务2已经获得了a=2的x锁,在执行insert into test (id, a) values (10, 2);时去申请a=2的s锁时还要受限于事务1在等待a=2的x锁而导致死锁,而不是直接授予事务2s锁,这样不是更好吗

阅读 1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题