Innodb 下, 一个表中有一个主键索引和一个非主键索引的时候
就会发生死锁的问题, 该如何解决呢 是不是因为 db 的并发过高了
![]() | 1 realpg PRO 没有数据量 没有并发量级 相当于啥也没说 |
3 lecher 2016-06-19 00:33:25 +08:00 这个量级并不算高,逻辑上面调一下,为什么要真实删除记录,伪删除足以满足业务需求了。 |
4 chinajik 2016-06-19 00:36:46 +08:00 并发改队列,我曾经作死用多线程去写 mysql... 挂了... |
![]() | 6 wweir 2016-06-19 05:48:58 +08:00 via Android 发生死锁必定是两个事务各持一把锁,并且两个事务(依赖的事务)正在等待对方的锁。 所以描述清楚锁的图谱基本就能理清这事了 |
![]() | 7 wweir 2016-06-19 05:51:46 +08:00 via Android ![]() 前段时间无聊读了点东西,偷懒的把 X 系列锁理解为写锁, S 系列锁理解为读锁。当然,这理解是不对的 |
![]() | 9 chaegumi 2016-06-19 10:43:04 +08:00 我现在还是小项目做了一个统计是分表的, INSERT INTO 受不了,会产生重复 key 错误,用 INSERT DELAYED INTO 就解决了 |
![]() | 10 realpg PRO 这点数据量,感觉是你的事务逻辑有问题 |
![]() | 13 swolf119 2016-06-19 14:42:08 +08:00 delete 不是根据主键的吗 非主键索引 delete 锁全表 |
![]() | 14 incompatible 2016-06-20 01:10:12 +08:00 把事务隔离级别设为 serialized 或者做一个悲观锁,每个事务开始之前都去获取这个悲观锁,获得了锁再继续往下做事 |
![]() | 15 skyim 2016-06-20 14:17:13 +08:00 @incompatible 如果这样的话,在高并发下面不是完啦 |
![]() | 16 incompatible 2016-06-20 19:18:47 +08:00 via iPhone @skyim 楼主的场景本来就无法应对高并发,我只是帮他解决了死锁的问题。 |
![]() | 17 quietin OP @incompatible 请问写多读少的情况, 用什么方案代替直接写 MySQL 比较好 |
![]() | 18 hbprotoss 2016-07-13 21:02:40 +08:00 repeatable read 隔离级别下, insert 会加间隙锁 |
![]() | 19 ihuotui 2017-01-15 20:37:21 +08:00 这就是为什么不用 delete 语句的原因,增加一个 delete 字段, 1 代表删除, 0 代表正常。 删除语句,和插入都是要求 X 锁,假如主键非唯一,还需要加上 gap 锁。当碰上删除一个 key 时,并插入一个相同 key ,或者删除同样的 key ,就是死锁。 参考 http://hedengcheng.com/?p=771 http://hedengcheng.com/?p=844#_Toc378337498 |