Innodb 下, 一个表中有一个主键索引和一个非主键索引的时候
就会发生死锁的问题, 该如何解决呢 是不是因为 db 的并发过高了
1
realpg 2016-06-18 20:25:47 +08:00
没有数据量 没有并发量级 相当于啥也没说
|
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 1
前段时间无聊读了点东西,偷懒的把 X 系列锁理解为写锁, S 系列锁理解为读锁。当然,这理解是不对的
|
9
chaegumi 2016-06-19 10:43:04 +08:00
我现在还是小项目做了一个统计是分表的, INSERT INTO 受不了,会产生重复 key 错误,用 INSERT DELAYED INTO 就解决了
|
10
realpg 2016-06-19 10:43:50 +08:00
这点数据量,感觉是你的事务逻辑有问题
|
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 |