TRANSACTION_READ_UNCOMMITTED在UPDATE上锁定索引

时间:2015-03-09 11:53:37

标签: java mysql jdbc transactions

对于我来说,我发现了一些意想不到的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;

理解这种锁定发生的原因将不胜感激。

0 个答案:

没有答案