对于我来说,我发现了一些意想不到的MYSQL行为,我希望得到一些反馈。我有以下两个表结构(customer_id字段之间存在FKEY关系):
tbl_customers
+-------------+------------------+
| customer_id | account_state_id |
+-------------+------------------+
| 1 | 0 |
| 2 | 0 |
| 3 | 0 |
+-------------+------------------+
tbl_customer_records
+-----------+-------------+
| record_id | customer_id |
+-----------+-------------+
| 1 | 1 |
+-----------+-------------+
在java中,我使用TRANSACTION_READ_UNCOMMITTED隔离级别从 tbl_customers 中选择一条记录,因为我想要脏读:
try(Connection con = DbFactory.getConnection()) {
con.setAutoCommit(false);
con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
Customer customer = Customer.selectById(con, 1);
//We preliminary update the customer state to avoid another server attempting the same
customer.setAccountStateId(1);
customer.update(con);
/*Perform long running work here*/
con.commit();
}
如果我现在尝试从具有新连接的其他线程为id为'1'的客户添加customer_record,那么如果“长时间运行的工作”尚未完成,我将获得锁定超时。
'customer.update(con)'命令似乎锁定了customer_id上的索引,阻止了对其他表的任何插入。使用以下内容无法看到此锁定
显示完整的过程列表;
,或者
显示OPEN TABLES;
理解这种锁定发生的原因将不胜感激。