MySQL INSERT 事务是否锁定外键引用表?

Do MySQL transactions for INSERT lock foreign key referenced tables?

我正在尝试在我的 Java 应用程序中做一个巨大的交易,并为 user_account_entry table 做单个插入条目(以千计),其中有外键引用 user table.

当事务为 运行 时,我无法更新属于获取 LockAcquisitionException

的事务的任何用户实体

我正在使用 MySQL InnoDB 并为事务使用 DEFAULT 隔离级别,转换为 InnoDB 的 REPEATABLE-READ 级别,任何人都可以阐明 [=24] 期间的外键锁定=] 交易

是的。

演示:在一个 window 中,创建父子 tables。

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)

向父级插入一行 table:

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

开始事务并向子行添加一行 table,引用父行:

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)

再打开一个 window,并尝试更新父项中引用的行:

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

挂起,等待第一个会话持有的锁。

返回到第一个 window 并提交释放锁的事务:

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

在第二个 window 中,更新继续进行,计时显示它等待了将近六秒,这是我回到第一个 window 提交所用的时间。

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

Java 具有 "batch" 插入能力。使用它一次最多插入 100 行。这将使 运行 速度提高 10 倍,从而有助于减少各种问题的发生 频率