Mariadb 从同一个表中删除相同的记录会导致死锁

Mariadb 从同一个表中删除相同的记录会导致死锁,mariadb,Mariadb,我们有一个表,存储公司的登录信息(公司将有多个用户),并在该公司的任何用户登录时删除该公司的所有记录(该公司的所有记录)。 我们收到上述情况的死锁,无法从应用程序端更改。 没有发生间隙锁定,两个delete都使用了正确的索引。在进行索引扫描时,数据的读取应该按顺序进行。如果是顺序,那么第二条语句应该等待获取锁,但它会导致死锁。 MariaDB版本:10.2.14 隔离:读提交 Below the table DDL CREATE TABLE `TableA` ( `TableAKY` I

我们有一个表,存储公司的登录信息(公司将有多个用户),并在该公司的任何用户登录时删除该公司的所有记录(该公司的所有记录)。 我们收到上述情况的死锁,无法从应用程序端更改。 没有发生间隙锁定,两个delete都使用了正确的索引。在进行索引扫描时,数据的读取应该按顺序进行。如果是顺序,那么第二条语句应该等待获取锁,但它会导致死锁。 MariaDB版本:10.2.14 隔离:读提交

Below the table DDL
CREATE TABLE `TableA` (
    `TableAKY` INT(11) NOT NULL AUTO_INCREMENT,
    `PERSONKY` INT(11) NOT NULL,
    `ID` INT(11) NULL DEFAULT NULL,
    `PackageName` VARCHAR(150) NOT NULL COLLATE 'utf8_bin',
    `LOCKEDKY` BIGINT(20) NULL DEFAULT NULL,
    `LASTACTIVITYDTTM` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `UPDATEDTTM` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `UPDATEUSER` VARCHAR(32) NOT NULL DEFAULT 'SYSTEM' COLLATE 'utf8_bin',
    `VERSIONSTAMP` SMALLINT(6) NOT NULL DEFAULT '1',
    `USERKY` INT(11) NULL DEFAULT '0',
    PRIMARY KEY (`TableAKY`),
    INDEX `TableA_GI1` (`LASTACTIVITYDTTM`),
    INDEX `TableA_GI2` (`PERSONKY`),
    INDEX `TableA_GI4` (`LOCKEDKY`),
    INDEX `TableA_GI3` (`ID`, `LASTACTIVITYDTTM`),
    CONSTRAINT `TableA_FK1` FOREIGN KEY (`PERSONKY`) REFERENCES `corperson` (`PERSONKY`)
)
COLLATE='utf8_bin'
ENGINE=InnoDB;
下面显示创建表

CREATE TABLE `TableA` (
`TableAKY` INT(11) NOT NULL AUTO_INCREMENT,
`PERSONKY` INT(11) NOT NULL,
`ID` INT(11) NULL DEFAULT NULL,
`PackageName` VARCHAR(150) NOT NULL COLLATE 'utf8_bin',
`LOCKEDKY` BIGINT(20) NULL DEFAULT NULL,
`LASTACTIVITYDTTM` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UPDATEDTTM` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UPDATEUSER` VARCHAR(32) NOT NULL DEFAULT 'SYSTEM' COLLATE 'utf8_bin',
`VERSIONSTAMP` SMALLINT(6) NOT NULL DEFAULT '1',
`USERKY` INT(11) NULL DEFAULT '0',
PRIMARY KEY (`TableAKY`),
INDEX `TableA_GI1` (`LASTACTIVITYDTTM`),
INDEX `TableA_GI2` (`PERSONKY`),
INDEX `TableA_GI4` (`LOCKEDKY`),
INDEX `TableA_GI3` (`ID`, `LASTACTIVITYDTTM`),
CONSTRAINT `TableA_FK1` FOREIGN KEY (`PERSONKY`) REFERENCES `corperson` (`PERSONKY`),
CONSTRAINT `TableA_CK9` CHECK (`VERSIONSTAMP` >= 0)
) ENGINE=InnoDB AUTO_INCREMENT=495189 DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC;
场景1--------从同一个表中删除不同的记录,但不同的会话会导致死锁

2019-09-05 11:02:06 140065601476352 [Note] InnoDB: Transactions deadlock detected, dumping detailed information.
2019-09-05 11:02:06 140065601476352 [Note] InnoDB: 
*** (1) TRANSACTION:

TRANSACTION 3665046721, ACTIVE 1 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 1
MySQL thread id 7139751, OS thread handle 140065636890368, query id 16445911731 <IP of Application 1> appid Updating
delete from TableA where current_timestamp>=lastActivityDtTm and ID=3
2019-09-05 11:02:06 140065601476352 [Note] InnoDB: *** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 26908 page no 4 n bits 72 index TableA_GI1 of table `DatabaseA`.`TableA` trx id 3665046721 lock_mode X locks rec but not gap waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 5d70818e; asc ]p  ;;
 1: len 4; hex 80125384; asc   S ;;

2019-09-05 11:02:06 140065601476352 [Note] InnoDB: *** (2) TRANSACTION:

TRANSACTION 3665046667, ACTIVE 1 sec starting index read
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1136, 2 row lock(s)
MySQL thread id 7126671, OS thread handle 140065601476352, query id 16445907427 <IP of Application 2> appid Updating
delete from TableA where current_timestamp>=lastActivityDtTm and ID=229753
2019-09-05 11:02:06 140065601476352 [Note] InnoDB: *** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 26908 page no 4 n bits 72 index TableA_GI1 of table `DatabaseA`.`TableA` trx id 3665046667 lock_mode X locks rec but not gap
Record lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 5d70818e; asc ]p  ;;
 1: len 4; hex 80125384; asc   S ;;

2019-09-05 11:02:06 140065601476352 [Note] InnoDB: (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 26908 page no 4 n bits 72 index TableA_GI1 of table `DatabaseA`.`TableA` trx id 3665046667 lock_mode X locks rec but not gap waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 5d7081a9; asc ]p  ;;
 1: len 4; hex 80125385; asc   S ;;

2019-09-05 11:02:06 140065601476352 [Note] InnoDB: *** WE ROLL BACK TRANSACTION (2)
2019-09-06 13:00:11 140064167008000 [Note] InnoDB: Transactions deadlock detected, dumping detailed information.
2019-09-06 13:00:11 140064167008000 [Note] InnoDB: 
*** (1) TRANSACTION:

TRANSACTION 3671781064, ACTIVE 1 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 1
MySQL thread id 7298913, OS thread handle 140064152139520, query id 16923847059 <IP of Application 2> appid Updating
delete from TableA where current_timestamp>=lastActivityDtTm and ID=1155003
2019-09-06 13:00:11 140064167008000 [Note] InnoDB: *** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 26908 page no 6 n bits 96 index TableA_GI3 of table `sparkdb`.`TableA` trx id 3671781064 lock_mode X locks rec but not gap waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 32
 0: len 4; hex 80119fbb; asc     ;;
 1: len 4; hex 5d71eed4; asc ]q  ;;
 2: len 4; hex 8012590a; asc   Y ;;

2019-09-06 13:00:11 140064167008000 [Note] InnoDB: *** (2) TRANSACTION:

TRANSACTION 3671780157, ACTIVE 15 sec starting index read
mysql tables in use 1, locked 1
549 lock struct(s), heap size 73936, 66 row lock(s), undo log entries 48
MySQL thread id 7277612, OS thread handle 140064167008000, query id 16923851347 <IP of Application 2> appid Updating
delete from TableA where current_timestamp>=lastActivityDtTm and ID=1155003
2019-09-06 13:00:11 140064167008000 [Note] InnoDB: *** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 26908 page no 6 n bits 96 index TableA_GI3 of table `sparkdb`.`TableA` trx id 3671780157 lock_mode X locks rec but not gap
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 32
 0: len 4; hex 80119fbb; asc     ;;
 1: len 4; hex 5d71eed4; asc ]q  ;;
 2: len 4; hex 8012590a; asc   Y ;;

2019-09-06 13:00:11 140064167008000 [Note] InnoDB: *** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 26908 page no 6 n bits 96 index TableA_GI3 of table `sparkdb`.`TableA` trx id 3671780157 lock_mode X locks rec but not gap waiting
Record lock, heap no 21 PHYSICAL RECORD: n_fields 3; compact format; info bits 32
 0: len 4; hex 80119fbb; asc     ;;
 1: len 4; hex 5d71ed15; asc ]q  ;;
 2: len 4; hex 801258ff; asc   X ;;

2019-09-06 13:00:11 140064167008000 [Note] InnoDB: *** WE ROLL BACK TRANSACTION (1)

Am i missing something to consider resolving this deadlock? , please help. Thanks in advance
2019-09-05 11:02:06 140065601476352[注]InnoDB:检测到事务死锁,正在转储详细信息。
2019-09-05 11:02:06 140065601476352[注]InnoDB:
***(1)交易:
事务3665046721,活动1秒开始索引读取
mysql表正在使用1,已锁定1
锁等待5锁结构,堆大小1136,4行锁,撤消日志条目1
MySQL线程id 7139751,操作系统线程句柄1400656890368,查询id 16445911731 appid更新
从表A中删除,其中当前时间戳>=lastActivityDtTm且ID=3
2019-09-05 11:02:06 140065601476352[注]InnoDB:**(1)等待授予此锁:
记录锁空间id 26908第4页n位72索引表'DatabaseA`.`TableA`trx id 3665046721锁模式X锁rec但不锁间隙等待
记录锁,堆2号物理记录:n_字段2;紧凑格式;信息位32
0:len4;六角5d70818e;asc]p;;
1:len4;十六进制80125384;asc S;;
2019-09-05 11:02:06 140065601476352[注]InnoDB:**(2)交易:
事务36650466667,活动1秒开始索引读取
mysql表正在使用1,已锁定1
3个锁结构,堆大小1136,2个行锁
MySQL线程id 7126671,操作系统线程句柄140065601476352,查询id 16445907427 appid更新
从表A中删除,其中当前时间戳>=lastActivityDtTm且ID=229753
2019-09-05 11:02:06 140065601476352[注]InnoDB:**(2)持有锁:
记录锁空间id 26908第4页n位72索引表'DatabaseA`.`TableA`trx id 36650466667锁模式X锁rec但不锁gap
记录锁,堆2号物理记录:n_字段2;紧凑格式;信息位32
0:len4;六角5d70818e;asc]p;;
1:len4;十六进制80125384;asc S;;
2019-09-05 11:02:06 140065601476352[注]InnoDB:(2)等待授予此锁:
记录锁空间id 26908第4页n位72索引表'DatabaseA`.`TableA`trx id 36650466667锁模式X锁rec但不锁间隙等待
记录锁,堆3号物理记录:n_字段2;紧凑格式;信息位32
0:len4;六角5d7081a9;asc]p;;
1:len4;十六进制80125385;asc S;;
2019-09-05 11:02:06 140065601476352[注]InnoDB:**我们回滚事务(2)
场景2--------从同一个表中删除相同的记录,但不同的会话会导致死锁

2019-09-05 11:02:06 140065601476352 [Note] InnoDB: Transactions deadlock detected, dumping detailed information.
2019-09-05 11:02:06 140065601476352 [Note] InnoDB: 
*** (1) TRANSACTION:

TRANSACTION 3665046721, ACTIVE 1 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 1
MySQL thread id 7139751, OS thread handle 140065636890368, query id 16445911731 <IP of Application 1> appid Updating
delete from TableA where current_timestamp>=lastActivityDtTm and ID=3
2019-09-05 11:02:06 140065601476352 [Note] InnoDB: *** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 26908 page no 4 n bits 72 index TableA_GI1 of table `DatabaseA`.`TableA` trx id 3665046721 lock_mode X locks rec but not gap waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 5d70818e; asc ]p  ;;
 1: len 4; hex 80125384; asc   S ;;

2019-09-05 11:02:06 140065601476352 [Note] InnoDB: *** (2) TRANSACTION:

TRANSACTION 3665046667, ACTIVE 1 sec starting index read
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1136, 2 row lock(s)
MySQL thread id 7126671, OS thread handle 140065601476352, query id 16445907427 <IP of Application 2> appid Updating
delete from TableA where current_timestamp>=lastActivityDtTm and ID=229753
2019-09-05 11:02:06 140065601476352 [Note] InnoDB: *** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 26908 page no 4 n bits 72 index TableA_GI1 of table `DatabaseA`.`TableA` trx id 3665046667 lock_mode X locks rec but not gap
Record lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 5d70818e; asc ]p  ;;
 1: len 4; hex 80125384; asc   S ;;

2019-09-05 11:02:06 140065601476352 [Note] InnoDB: (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 26908 page no 4 n bits 72 index TableA_GI1 of table `DatabaseA`.`TableA` trx id 3665046667 lock_mode X locks rec but not gap waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 5d7081a9; asc ]p  ;;
 1: len 4; hex 80125385; asc   S ;;

2019-09-05 11:02:06 140065601476352 [Note] InnoDB: *** WE ROLL BACK TRANSACTION (2)
2019-09-06 13:00:11 140064167008000 [Note] InnoDB: Transactions deadlock detected, dumping detailed information.
2019-09-06 13:00:11 140064167008000 [Note] InnoDB: 
*** (1) TRANSACTION:

TRANSACTION 3671781064, ACTIVE 1 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 1
MySQL thread id 7298913, OS thread handle 140064152139520, query id 16923847059 <IP of Application 2> appid Updating
delete from TableA where current_timestamp>=lastActivityDtTm and ID=1155003
2019-09-06 13:00:11 140064167008000 [Note] InnoDB: *** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 26908 page no 6 n bits 96 index TableA_GI3 of table `sparkdb`.`TableA` trx id 3671781064 lock_mode X locks rec but not gap waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 32
 0: len 4; hex 80119fbb; asc     ;;
 1: len 4; hex 5d71eed4; asc ]q  ;;
 2: len 4; hex 8012590a; asc   Y ;;

2019-09-06 13:00:11 140064167008000 [Note] InnoDB: *** (2) TRANSACTION:

TRANSACTION 3671780157, ACTIVE 15 sec starting index read
mysql tables in use 1, locked 1
549 lock struct(s), heap size 73936, 66 row lock(s), undo log entries 48
MySQL thread id 7277612, OS thread handle 140064167008000, query id 16923851347 <IP of Application 2> appid Updating
delete from TableA where current_timestamp>=lastActivityDtTm and ID=1155003
2019-09-06 13:00:11 140064167008000 [Note] InnoDB: *** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 26908 page no 6 n bits 96 index TableA_GI3 of table `sparkdb`.`TableA` trx id 3671780157 lock_mode X locks rec but not gap
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 32
 0: len 4; hex 80119fbb; asc     ;;
 1: len 4; hex 5d71eed4; asc ]q  ;;
 2: len 4; hex 8012590a; asc   Y ;;

2019-09-06 13:00:11 140064167008000 [Note] InnoDB: *** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 26908 page no 6 n bits 96 index TableA_GI3 of table `sparkdb`.`TableA` trx id 3671780157 lock_mode X locks rec but not gap waiting
Record lock, heap no 21 PHYSICAL RECORD: n_fields 3; compact format; info bits 32
 0: len 4; hex 80119fbb; asc     ;;
 1: len 4; hex 5d71ed15; asc ]q  ;;
 2: len 4; hex 801258ff; asc   X ;;

2019-09-06 13:00:11 140064167008000 [Note] InnoDB: *** WE ROLL BACK TRANSACTION (1)

Am i missing something to consider resolving this deadlock? , please help. Thanks in advance
2019-09-06 13:00:11 140064167008000[注]InnoDB:检测到事务死锁,正在转储详细信息。
2019-09-06 13:00:11 140064167008000[注]InnoDB:
***(1)交易:
事务3671781064,活动1秒开始索引读取
mysql表正在使用1,已锁定1
锁等待5锁结构,堆大小1136,4行锁,撤消日志条目1
MySQL线程id 7298913,操作系统线程句柄140064152139520,查询id 16923847059 appid更新
从表A中删除,其中当前时间戳>=lastActivityDtTm且ID=1155003
2019-09-06 13:00:11 140064167008000[注]InnoDB:**(1)等待授予此锁:
记录锁空间id 26908第6页n位96索引表'sparkdb'。'TableA`trx id 3671781064锁模式X锁rec但不间隔等待
记录锁,堆2号物理记录:n_字段3;紧凑格式;信息位32
0:len4;十六进制80119fbb;asc;;
1:len4;十六进制5d71eed4;asc]q;;
2:len4;十六进制8012590a;asc Y;;
2019-09-06 13:00:11 140064167008000[注]InnoDB:**(2)交易:
事务3671780157,活动15秒开始读取索引
mysql表正在使用1,已锁定1
549个锁结构,堆大小73936,66个行锁,撤消日志项48
MySQL线程id 7277612,操作系统线程句柄140064167008000,查询id 16923851347 appid更新
从表A中删除,其中当前时间戳>=lastActivityDtTm且ID=1155003
2019-09-06 13:00:11 140064167008000[注]InnoDB:**(2)持有锁:
记录锁空间id 26908第6页n位96索引表'sparkdb`.`TableA`trx id 3671780157锁模式X锁rec但非gap
记录锁,堆2号物理记录:n_字段3;紧凑格式;信息位32
0:len4;十六进制80119fbb;asc;;
1:len4;十六进制5d71eed4;asc]q;;
2:len4;十六进制8012590a;asc Y;;
2019-09-06 13:00:11 140064167008000[注]InnoDB:**(2)等待授予此锁:
记录锁空间id 26908第6页n位96索引表'sparkdb`.`TableA`trx id 3671780157锁模式X锁rec但不间隔等待
记录锁,堆号21物理记录:n_字段3;紧凑格式;信息位32
0:len4;十六进制80119fbb;asc;;
1:len4;十六进制5d71ed15;asc]q;;
2:len4;十六进制801258ff;asc X;;
2019-09-06 13:00:11 140064167008000[注]InnoDB:**我们回滚事务(1)
我错过了解决这个僵局的办法吗?请帮忙。提前谢谢

交易中不仅仅有
删除
?如果是,请向我们显示事务中的所有语句。同时提供
show CREATE TABLE
。您是否有索引(ID,lastActivityDtTm)——按此顺序?当用户登录的第一个查询被触发时(它删除自己的用户数据)“从表中删除,其中personky=1234”下一个被触发的命令是(删除该用户公司的所有数据)del