繁体   English   中英

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

[英]Lock a row in MySQL to prevent dirty reads?

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

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

    Game game = selectStatement(conn, gameId);

    doLongRunningWorkOnGameObject(game);

    updateStatement(conn, game);

    conn.commit();
}
...

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

有什么办法吗?

谢谢

在MySQL中,您可以使用SET TRANSACTION。 在每个游戏行更改之前设置交易,然后在该行上拥有排他锁。 更新游戏行,然后提交事务以释放锁,然后移至下一个用户转弯。 就像是:

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

MySQL SET交易

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM