有没有办法显式锁定表中的行?我需要在一行上运行一些应用程序逻辑,如下所示(java):
Connection conn = ...;
try {
conn.setAutoCommit(false);
Game game = selectStatement(conn, gameId);
doLongRunningWorkOnGameObject(game);
updateStatement(conn, game);
conn.commit();
}
...
因此,如果多个用户几乎同时进入此代码块,他们可能会处理他们正在处理的游戏行的各种脏状态。我想完全锁定该行,在这种情况下迫使其他用户等待(甚至读取它)。
有没有办法做到这一点?
由于
答案 0 :(得分:0)
在MySQL中,您可以使用SET TRANSACTION。在每个游戏行更改之前设置事务,然后在该行上有一个独占锁。更新游戏行,然后提交事务以释放锁定,然后移动到下一个用户转向。类似的东西:
updateStatement(conn, game) {
START TRANSACTION GAME_MOVE;
... code to do the move...
COMMIT TRANSACTION GAME_MOVE;
}