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 倍,从而有助于减少各种问题的发生 频率 。
我正在尝试在我的 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 倍,从而有助于减少各种问题的发生 频率 。