Par*_*wan 8 mysql innodb transactions isolation-level
我正在尝试在我的Java应用程序中执行一个巨大的事务,并为user_account_entry具有对user表的外键引用的表执行单个插入条目(数量以千为单位)。
当事务运行时,我无法更新属于获取事务的任何用户实体LockAcquisitionException
我正在使用 MySQL InnoDB 并使用DEFAULT事务隔离级别(该级别转换REPEATABLE-READ为 InnoDB 级别),任何人都可以阐明 mysql 事务期间的外键锁定
Bil*_*win 13
是的。
演示:在一个窗口中创建父表和子表。
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)
Run Code Online (Sandbox Code Playgroud)
在父表中插入一行:
mysql1> insert into parent values (1, 1);
Query OK, 1 row affected (0.02 sec)
Run Code Online (Sandbox Code Playgroud)
启动事务并向子表添加一行,引用父行:
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)
Run Code Online (Sandbox Code Playgroud)
打开第二个窗口,并尝试更新父级中引用的行:
mysql2> update parent set x = 2 where x = 1;
Run Code Online (Sandbox Code Playgroud)
它挂起,等待第一个会话持有的锁。
返回到第一个窗口并提交事务,这会释放锁:
mysql1> commit;
Query OK, 0 rows affected (0.02 sec)
Run Code Online (Sandbox Code Playgroud)
在第二个窗口中,更新继续进行,计时显示它等待了将近六秒,这是我回到第一个窗口进行提交所花费的时间。
Query OK, 1 row affected (5.92 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3575 次 |
| 最近记录: |