首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入锁外键引用表的MySQL事务吗?

插入锁外键引用表的MySQL事务吗?
EN

Stack Overflow用户
提问于 2019-02-13 14:31:45
回答 2查看 2.7K关注 0票数 4

我试图在我的Java应用程序中执行一个巨大的事务,并对具有user_account_entry表外键引用的user表执行单个insert条目(以千计)。

当事务正在运行时,我无法更新属于获得LockAcquisitionException的事务的任何用户实体。

我正在使用MySQL InnoDB和DEFAULT隔离级别来处理事务,该级别转换成了InnoDB的REPEATABLE-READ级别,有人能在mysql事务期间了解一些外键锁定信息吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-14 00:25:09

是。

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

代码语言:javascript
复制
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)

在父表中插入一行:

代码语言:javascript
复制
mysql1> insert into parent values (1, 1);
Query OK, 1 row affected (0.02 sec)

启动事务并向子表中添加一行,引用父行:

代码语言:javascript
复制
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)

打开第二个窗口,尝试更新父窗口中引用的行:

代码语言:javascript
复制
mysql2> update parent set x = 2 where x = 1;

它挂着,等待着第一个会话所持有的锁。

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

代码语言:javascript
复制
mysql1> commit;
Query OK, 0 rows affected (0.02 sec)

在第二个窗口中,更新继续进行,时间显示它等待了将近6秒,我花了很长时间才回到第一个窗口提交。

代码语言:javascript
复制
Query OK, 1 row affected (5.92 sec)
Rows matched: 1  Changed: 1  Warnings: 0
票数 8
EN

Stack Overflow用户

发布于 2019-02-14 23:23:09

Java具有“批处理”插入功能。使用它一次最多插入100行。这将以10倍的速度运行,从而有助于减少各种问题的频度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54672633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档