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

时间:2019-02-13 14:31:45

标签: mysql transactions innodb isolation-level

我正在尝试在Java应用程序中进行大型交易,并为user_account_entry表做单个插入项(成千上万次),该表具有对user表的外键引用。

交易正在运行时,我无法更新该交易所属的任何用户实体,获取LockAcquisitionException

我正在使用MySQL InnoDB,并且对事务使用了DEFAULT隔离级别,对于InnoDB,它已转换为REPEATABLE-READ级别,任何人都可以对mysql事务期间的外键锁定有所了解

2 个答案:

答案 0 :(得分:0)

是的

演示:在一个窗口中,创建父表和子表。

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;

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

返回第一个窗口并提交事务,该事务将释放锁:

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

在第二个窗口中,更新继续进行,时间显示它等待了将近6秒钟,这是我回到第一个窗口进行提交所花费的时间。

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

答案 1 :(得分:0)

Java具有“批处理”插入功能。使用它一次最多可插入100行。该过程的运行速度将提高10倍,从而有助于使各种问题的发生频率降低。