0

我正在构建一个游戏会话,每个会话都有许多状态。当游戏要求下一步时,选择当前游戏会话,然后选择最新的游戏状态。用户对状态执行操作,将其返回,与上一个状态进行检查,如果有效,则保存操作,创建新状态并将其返回给用户。这个过程重复。在游戏结束时,游戏会话被标记为结束,并创建一个新会话。

如果任何动作同时提交两次,它们都将能够获取相同的游戏会话,获取最新的游戏状态并针对该动作进行验证。该事务似乎只是阻止写入事务中修改的任何行。无论哪个第二个被击中,都会等到第一个完成,然后写入它的数据并创建下一个游戏状态。

我需要在游戏会话行上创建一个读锁,所以如果任何实例在某个事务中对游戏会话状态执行任何操作,任何其他读取游戏会话的尝试都将被延迟,直到该实例/事务完成,所以read 将始终在事务后获取数据。

我无法找出如何创建行读锁。有人可以帮助我吗?谢谢。

编辑:

我想我需要在事务中执行 SELECT 游戏会话行 FOR UPDATE,这将锁定该行以供读取,但是在事务之前我会有一个 SELECT 游戏会话行 LOCK IN SHARE MODE 以确保它等到它可以开始了吗?

不确定我是否正确使用了这些。

在我用 PDO 抽象的 PHP 代码中的某个地方(特别是 Eloquent):

SELECT FROM game_session WHERE id = 5 LOCK IN SHARE MODE; #wait till any lock is completed
BEGIN TRANSACTION;
    SELECT FROM game_session WHERE id = 5 FOR UPDATE; #lock the row
    /* stuff */
END TRANSACTION;

这似乎有点多余。我知道事务隔离级别也有很多,虽然我不清楚这会在哪里绑定,是否需要 SERIALIZABLE?还是会弄乱“更新”位?

4

0 回答 0