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

标签 java mysql locking

有什么方法可以显式锁定表中的行吗?我有一些需要连续运行的应用程序逻辑,如下所示 (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 TRANSACTION

关于java - 在 MySQL 中锁定一行以防止脏读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34072800/

相关文章:

java - 无法将 xml 转换为 java 对象

java - 如何更改 Adapter 类中的 itemLayout

java - 升级到 Spring Boot 2.2.2.RELEASE + Thymeleaf 3.0.11.RELEASE,thymeleaf/layout 停止工作

mysql - 两次连接表会使查询变慢

mysql - SQL查询: Number of channel_views and clicks by dancer_name in the last 7 days

java - 错误 : org. hibernate.hql.internal.ast.ErrorCounter - 第 1:45 行:意外标记:从表中获取最后一条记录时的 DESC

java - 将远程 Mysql 连接到 Netbeans

java - 不稳定的 StampedLock.unlock(long) 行为?

mysql - 在执行 SELECT 后跟 INSERT 时是否需要锁定 MySQL 表?

尝试使用 ReetrantLock(true) 锁定/解锁时 Java 线程锁