处理从两个或多个连接访问和更改的列 (MySQL)
Handle column accessed and changed from two or more connections (MySQL)
我需要你的建议。
我有一个 mysql 数据库,用于存储来自我的世界服务器的数据。服务器正在使用 ebean api 作为 mysql 内容。
当用户群增加时,我将有多个服务器运行 同步相同的数据。用户连接到的服务器无关紧要。他看起来都一样。但是我该如何处理一个示例,在这个示例中,同一个公会中的两个玩家从两个服务器同时编辑一些东西。一台服务器会抛出乐观锁异常。但是如果是向公会银行捐款这种重要的事情怎么办?捐赠的金额可能会被骗或丢失。告诉用户重试吗?或者让服务器自动重新发送来自数据库的更新数据的查询?我的一个朋友说在中间处理所有 mysql 语句的套接字服务器之类的东西可能是个好主意。但这将需要大量工作来确保它在连接丢失等情况下重新连接到 minecraft 服务器。它还需要我获取原始更新查询或序列化 ebean table 但我不这样做不知道如何实现这些可能性。
我还没有找到我的问题的答案,希望之前没有人回答过。
Minecraft 服务器可以在 DBMS 上执行两种不同的操作。一方面,您有状态更新操作,例如向帐户存款。这些操作的历史很重要。为了完整性,您必须为这些使用事务。它们不是 idempotent,这意味着您不能多次重复它们并期望得到与只执行一次相同的结果。您应该调查 SELECT ... FOR UPDATE
交易的使用情况。
如果在此类交易中出现问题,您必须发出 ROLLBACK
交易并重试。你最好记录这些重试,以防你得到大量回滚:这表明你有某种并发问题需要追踪。
顺便说一下,您无需为
等查询的显式事务操心
UPDATE credit SET balance = balance + 200 WHERE account = 12367
即使多个连接访问同一个帐号,您的 DBMS 也会正确执行此操作。
另一种操作是幂等的。也就是说,如果多次执行该操作,结果与执行一次的结果相同。例如,设置玩家的名字是幂等的。对于这些操作,如果您遇到某种异常,您可以重复操作,或者简单地忽略失败,假设稍后会在正常的游戏序列中重复操作。
我需要你的建议。 我有一个 mysql 数据库,用于存储来自我的世界服务器的数据。服务器正在使用 ebean api 作为 mysql 内容。
当用户群增加时,我将有多个服务器运行 同步相同的数据。用户连接到的服务器无关紧要。他看起来都一样。但是我该如何处理一个示例,在这个示例中,同一个公会中的两个玩家从两个服务器同时编辑一些东西。一台服务器会抛出乐观锁异常。但是如果是向公会银行捐款这种重要的事情怎么办?捐赠的金额可能会被骗或丢失。告诉用户重试吗?或者让服务器自动重新发送来自数据库的更新数据的查询?我的一个朋友说在中间处理所有 mysql 语句的套接字服务器之类的东西可能是个好主意。但这将需要大量工作来确保它在连接丢失等情况下重新连接到 minecraft 服务器。它还需要我获取原始更新查询或序列化 ebean table 但我不这样做不知道如何实现这些可能性。
我还没有找到我的问题的答案,希望之前没有人回答过。
Minecraft 服务器可以在 DBMS 上执行两种不同的操作。一方面,您有状态更新操作,例如向帐户存款。这些操作的历史很重要。为了完整性,您必须为这些使用事务。它们不是 idempotent,这意味着您不能多次重复它们并期望得到与只执行一次相同的结果。您应该调查 SELECT ... FOR UPDATE
交易的使用情况。
如果在此类交易中出现问题,您必须发出 ROLLBACK
交易并重试。你最好记录这些重试,以防你得到大量回滚:这表明你有某种并发问题需要追踪。
顺便说一下,您无需为
等查询的显式事务操心UPDATE credit SET balance = balance + 200 WHERE account = 12367
即使多个连接访问同一个帐号,您的 DBMS 也会正确执行此操作。
另一种操作是幂等的。也就是说,如果多次执行该操作,结果与执行一次的结果相同。例如,设置玩家的名字是幂等的。对于这些操作,如果您遇到某种异常,您可以重复操作,或者简单地忽略失败,假设稍后会在正常的游戏序列中重复操作。