Удаление одинаковых записей из одной таблицы приводит к тупику - PullRequest
0 голосов
/ 26 сентября 2019

У нас есть таблица, в которой хранится информация о регистрации компании (у компании будет несколько пользователей) и удаляются все записи компании (все записи этой компании), когда ЛЮБОЙ пользователь этой компании входит в систему.мы получаем тупик для вышеуказанного случая, не может измениться со стороны приложения.Не происходит Gap Lock, и оба удаления используют соответствующий индекс.Поскольку это идет для сканирования индекса, чтение данных должно быть в последовательном порядке.Если это последовательный порядок, то второй оператор должен ждать получения блокировки, но он вызывает Deadlock.MariaDB версия: 10.2.14 Изоляция: READ-COMMITTED

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;


Scenario 1
-----------
Deleting different records from same table, but different sessions causing deadlock

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)


Scenario 2
-----------
Deleting same records from same table, but different sessions causing deadlock

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...