gpt4 book ai didi

mysql - MMORPG 中的数据库事务是如何发生的?

转载 作者:搜寻专家 更新时间:2023-10-30 20:25:56 27 4
gpt4 key购买 nike

我构建了一个 MMORPG,它使用 MySQL 数据库在用户注销时存储玩家相关数据。

我们内置了一个自动保存计时器,以便每 3 小时将每个登录用户的所有数据保存到数据库中。

在这样做的过程中,我们注意到了一个致命的缺陷......

由于我们所有的数据库事务都被发送到单个数据库线程,该线程可能会积压请求。这会产生登录/保存问题。发生这种情况时,玩家无法登录,因为登录过程需要使用 DB 线程来确认登录凭据。同样,所有保存请求都排在数据库线程计划的后面。这会产生大量请求……

对此我能想到的唯一解决方案是引入多线程,并有3-4个线程与数据库交互。

但是,这会引发一个新问题。由于多个线程被发送 DB 请求,这意味着一个线程可以接收来自玩家的保存请求,而另一个 DB 线程接收来自同一玩家的保存请求。

例如……玩家A登录游戏3 小时过去,自动保存发生,玩家 A 的数据现在将被保存。玩家 A 杀死怪物并获得经验。PlayerA 注销,这会向数据库线程添加一个保存请求。

现在我们有两个不同的保存请求在数据库中排队。假设它们都分配给两个不同的数据库线程,这可能会导致用户数据以错误的顺序保存......例如,处理 PlayerA 的注销保存的线程可能首先运行,然后 PlayerA 的自动保存运行在单独的线程上....这会导致数据丢失(在这种情况下是经验)。

其他 MMORPG 是如何处理这样的事情的?

最佳答案

如果您还没有使用数据库连接池,您需要一个,并确保您没有锁定超过您需要的数据。如果您正在保存玩家拥有的金币数量,则无需锁定持有凭据的表格。

在多线程场景中保持事件顺序不是小问题,我建议使用消息队列,每个玩家一个生产者,每个玩家一个消费者。 This link显示了 2 种策略来保持顺序。

由于其他原因,队列实际上很重要。如果保存请求失败,它将留在队列中稍后重试。在处理玩家的金钱和元素时,您可能需要这个。

关于mysql - MMORPG 中的数据库事务是如何发生的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34205368/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com