gpt4 book ai didi

mysql - 处理从两个或多个连接访问和更改的列 (MySQL)

转载 作者:行者123 更新时间:2023-11-28 23:48:15 25 4
gpt4 key购买 nike

我需要你的建议。我有一个 mysql 数据库,用于存储来 self 的世界服务器的数据。服务器正在使用 ebean api 处理 mysql 内容。

当用户群增加时,我将有多个服务器运行相同的同步数据。用户连接到的服务器无关紧要。他看起来都一样。但是我该如何处理一个示例,在这个示例中,同一个公会中的两个玩家从两个服务器同时编辑一些东西。一台服务器会抛出乐观锁异常。但是如果是向公会银行捐款这种重要的事情怎么办?捐赠的金额可能会被骗或丢失。告诉用户重试吗?或者让服务器自动重新发送来自数据库的更新数据的查询?我的一个 friend 说在中间处理所有 mysql 语句的套接字服务器之类的东西可能是个好主意。但这需要大量工作来确保它在连接丢失等情况下重新连接到 minecraft 服务器。它还需要我获取原始更新查询或序列化 ebean 表,但我不知道如何完成任何这些可能性。


我还没有找到我的问题的答案,我希望以前没有人回答过它。

最佳答案

Minecraft 服务器可以在 DBMS 上执行两种不同的操作。一方面,您有状态更新操作,例如向帐户存款。这些操作的历史很重要。为了完整性,您必须为这些使用事务。它们不是 idempotent,这意味着您不能多次重复它们并期望得到与只执行一次相同的结果。您应该针对这些调查使用 SELECT ... FOR UPDATE 事务。

如果在这样的事务中出现问题,您必须对该事务发出 ROLLBACK 并重试。您最好记录这些重试,以防发生大量回滚:这表明您有某种并发问题需要追踪。

顺便说一下,你不需要为像

这样的查询显式事务而烦恼
UPDATE credit SET balance = balance + 200 WHERE account  = 12367

即使多个连接访问同一个帐号,您的 DBMS 也能做到这一点。

另一种操作是幂等的。也就是说,如果多次执行该操作,结果与执行一次的结果相同。例如,设置玩家的名字是幂等的。对于这些操作,如果您遇到某种异常,您可以重复操作,或者简单地忽略失败,假设稍后会在正常的游戏序列中重复操作。

关于mysql - 处理从两个或多个连接访问和更改的列 (MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33070684/

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