Блокируют ли транзакции MySQL для INSERT таблицы внешних ссылок? - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь выполнить огромную транзакцию в своем приложении Java и выполняю отдельные записи вставки (объем в тысячах) для таблицы user_account_entry, которая имеет ссылку на внешний ключ к таблице user.

Когда транзакциявыполняется, я не могу обновить любую пользовательскую сущность, для которой принадлежит транзакция, получая LockAcquisitionException

Я использую MySQL InnoDB и использую DEFAULT уровень изоляции для транзакции, которая переведена в REPEATABLE-READуровень для InnoDB, может кто-нибудь пролить свет на блокировку внешнего ключа во время транзакций mysql

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Java имеет возможность «пакетной» вставки.Используйте его для вставки до 100 строк одновременно.Это будет работать в 10 раз быстрее, тем самым помогая решить множество проблем реже .

0 голосов
/ 14 февраля 2019

Да.

Демонстрация: в одном окне создайте родительские и дочерние таблицы.

mysql1> create table parent (id int primary key, x int );
Query OK, 0 rows affected (0.04 sec)

mysql1> create table child (id int primary key, parentid int,
    foreign key(parentid) references parent(id));
Query OK, 0 rows affected (0.03 sec)

Вставьте строку в родительскую таблицу:

mysql1> insert into parent values (1, 1);
Query OK, 1 row affected (0.02 sec)

Началотранзакции и добавьте строку в дочернюю таблицу, ссылаясь на родительскую строку:

mysql1> begin;
Query OK, 0 rows affected (0.00 sec)

mysql1> insert into child values (42, 1);
Query OK, 1 row affected (0.00 sec)

Откройте второе окно и попробуйте обновить строку, на которую ссылается родительская строка:

mysql2> update parent set x = 2 where x = 1;

Itзависает, ожидая блокировки, удерживаемой первым сеансом.

Вернитесь к первому окну и подтвердите транзакцию, которая снимает блокировки:

mysql1> commit;
Query OK, 0 rows affected (0.02 sec)

Во втором окне обновление продолжаетсяи время показывает, что он ждал почти шесть секунд, время, которое потребовалось мне, чтобы вернуться к первому окну для фиксации.

Query OK, 1 row affected (5.92 sec)
Rows matched: 1  Changed: 1  Warnings: 0
...