Java 是否可以保持选择。。。是否在提交后更新行锁?

Java 是否可以保持选择。。。是否在提交后更新行锁?,java,mysql,locking,Java,Mysql,Locking,我有一个SELECT语句,我想用它来锁定所选行以进行结果集更新。特别是, stmt = conn.prepareStatement("SELECT name, in_use, done FROM test LIMIT 1 FOR UPDATE;", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery(); if ( rs != null && rs.l

我有一个SELECT语句,我想用它来锁定所选行以进行结果集更新。特别是,

stmt = conn.prepareStatement("SELECT name, in_use, done FROM test LIMIT 1 FOR UPDATE;", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery();
if ( rs != null && rs.last() ) {
    name = rs.getString(1);
    System.out.println(name);

    Thread.sleep(60_000);
    // --- Is it possible to keep the row-lock here? ---

    rs.updateInt(2, 1);
    rs.updateRow();
}
我意识到我可以在1分钟的睡眠时间内对所选行进行任何形式的更改。任何关于如何在关闭结果集之前保持行锁定的提示都将不胜感激


提前非常感谢。

问题是在提交后,但我没有看到提交发生在这里。。。也不确定为什么要将一行锁定一整分钟。通常,您希望尽快释放它们。我试图解释的是,1要使用行锁,您必须启动事务并提交或禁用自动提交,2当一行被锁定时,只有MySQL连接(在MySQL术语中称为会话或线程)可以修改它。无法在此处锁定行连接1并在此处修改它连接2。请选择。。。FOR UPDATE会在事务提交之前锁定行,但正如您所注意到的,如果您处于自动提交模式,则提交会立即进行。成功后,使用“选择”进行第二次连接。。。FOR UPDATE`将挂起,直到释放锁。您还可以通过使用FOR UPDATE发出一个查询,如果行存在,则该查询将找到该行,从而锁定一个间隙(即该行所在的位置),防止其他人插入该行。展示。行为是相似的,所以答案可能对你的理解有用。建议使用CLI进行测试。不,没有。您必须在一个事务中完成这一切,因为行锁是事务的函数。执行计算的代码应该是选择更新、修改行、执行计算、再次修改、提交。