账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    mysql死锁问题
    30
    0

    采用的是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锁,这样不是更好吗

    0
    打赏
    收藏
    点击回答
        全部回答
    • 共 0 条
    • Pasttense 普通会员 1楼

      MySQL死锁是指两个或更多的进程由于争夺资源而相互等待对方释放资源,从而导致整个系统的资源都无法被有效地使用的情况。这通常是由于并发控制机制、资源调度策略等不当设计引起的。

      例如,一个进程试图获取一个共享资源,而另一个进程则等待该资源,这种情况就会导致死锁。

      要解决MySQL死锁问题,有以下几种方法:

      1. 使用事务:事务可以确保在并发执行多个操作时,只有一个操作可以被阻塞,以防止死锁。

      2. 使用死锁检测和检测机制:例如使用死锁检测和检测机制,当检测到死锁时,会自动断开锁并尝试重新排序资源。

      3. 使用资源管理器:MySQL提供了资源管理器,可以自动管理资源的分配和释放,以防止死锁。

      4. 使用死锁预防策略:例如,可以设置超时时间,当一个进程在某个时刻无法获取资源时,会自动放弃并尝试重新排序资源。

      以上是解决MySQL死锁问题的一些方法,但具体应用时还需要根据实际的系统情况和需求进行调整。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部