我试图在我的Java应用程序中执行一个巨大的事务,并对具有user_account_entry表外键引用的user表执行单个insert条目(以千计)。
当事务正在运行时,我无法更新属于获得LockAcquisitionException的事务的任何用户实体。
我正在使用MySQL InnoDB和DEFAULT隔离级别来处理事务,该级别转换成了InnoDB的REPEATABLE-READ级别,有人能在mysql事务期间了解一些外键锁定信息吗?
发布于 2019-02-14 00:25:09
是。
演示:在一个窗口中,创建父表和子表。
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发布于 2019-02-14 23:23:09
Java具有“批处理”插入功能。使用它一次最多插入100行。这将以10倍的速度运行,从而有助于减少各种问题的频度。
https://stackoverflow.com/questions/54672633
复制相似问题