Как этот тупик случится? - PullRequest
0 голосов
/ 29 декабря 2018

Недавно я передаю вопрос SQL, у меня есть две транзакции, транзакция A сначала получила блокировки следующего ключа, и транзакция B попыталась получить такую ​​же блокировку, поэтому она ожидала, затем транзакция A попыталась получитьВставьте намеренные блокировки, чтобы произошла тупиковая ситуация.Но я не понимаю, почему это произошло?

Вот моя структура таблицы:

CREATE TABLE `changeset` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT',    
  `userId` int(10) NOT NULL COMMENT,    
  `documentId` varchar(20) NOT NULL,    
  `memberId` bigint(13) NOT NULL,    
  `createTime` bigint(13) NOT NULL,    
  `version` bigint(13) NOT NULL COMMENT,    
  `changesets` mediumtext,    
  PRIMARY KEY (`id`),    
  UNIQUE KEY `uniq_documentId_version` (`documentId`,`version`) USING BTREE    
) ENGINE=InnoDB AUTO_INCREMENT=85771623 DEFAULT CHARSET=utf8

А вот мой журнал тупиковых ситуаций:

(1)СДЕЛКА:

СДЕЛКА 22640, АКТИВНОЕ Чтение 66-секундного начального индекса

Используются таблицы MySQL 1, заблокировано 1

LOCK WAIT 2 структуры блокировки, размер кучи 1136,Блокировка 1 строки

Идентификатор потока MySQL 209, дескриптор потока ОС 123145559986176, идентификатор запроса 6204 root локального хоста Отправка данных

select * from changeset where documentId = '7oO5C_v' and version >= 13 for update

(1) ЖДЕТ ЭТОГОБлокировка для предоставления:

ЗАПИСИ ЗАПИСЕЙ идентификатор пространства 107 страница нет 15 n битов 704 индекс uniq_documentId_version таблицы test. changeset идентификатор trx 22640 lock_mode X ожидание

блокировка записи, куча нет2 ФИЗИЧЕСКАЯ ЗАПИСЬ: n_fields 3;компактный формат;биты информации 0

0: len 7;гекс 3976735431644а;asc 9vsT1dJ ;;

1: len 8;гекс 8000000000000000;asc ;;

2: len 4;гекс 051cbef7;asc ;;

(2) СДЕЛКА:

СДЕЛКА 22639, АКТИВНО 95 секунд вставка

используемых таблиц mysql 1, заблокировано 1

6 lock struct(s), размер кучи 1136, 4 блокировки строк, отмена записей журнала 1

идентификатор потока MySQL 212, дескриптор потока ОС 123145561657344, идентификатор запроса 6210 обновление корня локального хоста insert into changeset values (0, 9, '7oO5C_v', 814, 1, 13, 'x')

(2) Удерживает замок (ы):

ЗАПИСИ ЗАПИСЕЙ идентификатор пространства 107 страница нет 15 n битов 704 индекс uniq_documentId_version таблицы test. changeset идентификатор trx 22639 lock_mode X

записьблокировка, куча нет 2 ФИЗИЧЕСКАЯ ЗАПИСЬ: n_fields 3;компактный формат;биты информации 0

0: len 7;гекс 3976735431644а;asc 9vsT1dJ ;;

1: len 8;гекс 8000000000000000;asc ;;

2: len 4;гекс 051cbef7;asc ;;

(2) В ожидании этой блокировки:

ЗАПИСИ ЗАПИСЕЙ пробел id 107 страница нет 15 n битов 704 index uniq_documentId_version таблицы test. changeset trx id22639 lock_mode X блокирует пробел перед ожиданием вставки записи

Блокировка записи, куча № 2 ФИЗИЧЕСКАЯ ЗАПИСЬ: n_fields 3;компактный формат;биты информации 0

0: len 7;гекс 3976735431644а;asc 9vsT1dJ ;;

1: len 8;гекс 8000000000000000;asc ;;

2: len 4;гекс 051cbef7;asc ;;

СДЕЛАЕМ ОБРАТНУЮ СДЕЛКУ (1)

1 Ответ

0 голосов
/ 29 декабря 2018

Использовали ли вы "(nolock)" для выбора?

Select * From Table with (nolock)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...