在MySQL中锁定一行以防止脏读?

时间:2015-12-03 17:47:44

标签: java mysql locking

有没有办法显式锁定表中的行?我需要在一行上运行一些应用程序逻辑,如下所示(java):

Connection conn = ...;
try {
    conn.setAutoCommit(false);

    Game game = selectStatement(conn, gameId);

    doLongRunningWorkOnGameObject(game);

    updateStatement(conn, game);

    conn.commit();
}
...

因此,如果多个用户几乎同时进入此代码块,他们可能会处理他们正在处理的游戏行的各种脏状态。我想完全锁定该行,在这种情况下迫使其他用户等待(甚至读取它)。

有没有办法做到这一点?

由于

1 个答案:

答案 0 :(得分:0)

在MySQL中,您可以使用SET TRANSACTION。在每个游戏行更改之前设置事务,然后在该行上有一个独占锁。更新游戏行,然后提交事务以释放锁定,然后移动到下一个用户转向。类似的东西:

updateStatement(conn, game) {
    START TRANSACTION GAME_MOVE;   
    ... code to do the move...
    COMMIT TRANSACTION GAME_MOVE;
}

MySQL SET TRANSACTION