Обнаружена мертвая блокировка. При использовании LOCK_DATA с несколькими столбцами при запуске выберите * из PerformanceMySql

Форум по Mysql
Ответить
Anonymous
 Обнаружена мертвая блокировка. При использовании LOCK_DATA с несколькими столбцами при запуске выберите * из Performance

Сообщение Anonymous »

Я не знаю, почему здесь используется LOCK_DATA с несколькими столбцами при запуске select * from Performance_schema.data_locks. Это похоже на 'a', NULL,1 .
a — это индексированное значение столбца_1 в таблице test_table. 1 — это первичный ключ в test_table. Возникла проблема: когда я обновляю определенную строку в test_table исходным значением «a» столбца_1, кажется, что она запрашивает LOCK DATA.

Код: Выделить всё

'a',NULL, 1. Однако я получил блокировку строки только для этой конкретной строки 1
. Это может привести к неожиданным тупикам. Кто-нибудь знает, почему это происходит?
Моя структура таблицы:
table1: test_table
table2: test_table2

Код: Выделить всё

    create table test_table
(
id       int          not null
primary key,
column_1 varchar(100) null,
column_4 int          null
);

create index `1_4_index`
on test_table (column_1, column_4);

create index id_index
on test_table (column_1);

create table test_table2
(
id       int          not null
primary key,
column_3 varchar(100) null,
column_5 varchar(100) null
);

table1 data:
id column1 column_4
1   a       NULL
2   c       NULL
3   a       NULL
4   c       NULL

table2 data:
id column3 column_5
1    ""       NULL
2    ""     NULL
3    ""      NULL
4    ""      NULL
Моя транзакция1:

Код: Выделить всё

begin;
select *
from test_table
INNER join test_table2 t on test_table.id = t.id
where test_table.id=1  for update
update test_table set column_1='x' where id=1
commit;
Моя транзакция2:

Код: Выделить всё

begin;
use commit_queue
select *
from test_table
inner join test_table2 on test_table.id = test_table2.id
where test_table.column_1 = 'a' for update
commit;
Сначала я выполняю команду выбора транзакции 1, затем результат выбора * из Performance_schema.data_locks ниже




INDEX_NAMELOCK_TYPE
LOCK_MODE
LOCK_STATUS
LOCK_DATA
OBJECT_NAME




1
NULL
ТАБЛИЦА
IX
GRANTED
NULL
test_table_2


2
NULL
ТАБЛИЦА
IX
GRANTED
NULL
test_table

3
ПЕРВИЧНАЯ
ЗАПИСЬ
X,REC_NOT_GAPGRANTED
1
test_table

4
ПЕРВИЧНАЯ
ЗАПИСЬ
X,REC_NOT_GAPПРЕДОСТАВЛЕНО
1
test_table_2



а затем выполните команду выбора транзакции 2. Результат ниже:



INDEX_NAME
LOCK_TYPE
LOCK_MODE
LOCK_STATUS
LOCK_DATA
OBJECT_NAME



< tr>
1
NULL
ТАБЛИЦА
IX
ДАНО
NULL
test_table


21_4_index
ЗАПИСЬ
X
ДОСТУПНА
'a',NULL,1
test_table


3
ПЕРВИЧНЫЙЗАПИСЬ
X,REC_NOT_GAP
ОЖИДАНИЕ
1test_table


4
NULL
ТАБЛИЦАIX
GRANTED
NULL
test_table_2


5
NULL
ТАБЛИЦА
IX
GRANTED
NULL
test_table


6
ПЕРВИЧНАЯ
ЗАПИСЬ
X,REC_NOT_GAP
ГАРАНТИРОВАННАЯ
1
test_table


7ПЕРВИЧНАЯ
ЗАПИСЬ
X,REC_NOT_GAP
ГАРАНТИРОВАННАЯ
1
test_table_2



Наконец, я выполняю команда обновления транзакции 1. Обнаружена взаимоблокировка.
Я думаю, это может быть вызвано индексом, поскольку LOCK_DATA транзакции 1 равен 1, а транзакция 2 снова заблокирует эту строку с помощью LOCK_DATA 'a',NULL,1. Я ожидал, что будет только одна блокировка, но похоже, что одна и та же строка данных блокируется дважды.
Итак, у меня вопрос:

[*]что такое lock_data 'a',NULL,1, в чем разница между ним и '1' и почему здесь произойдет взаимоблокировка
< /ул>

Подробнее здесь: https://stackoverflow.com/questions/793 ... om-perform
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»