如果交易失败怎么办?

问题描述 投票:0回答:1

所以基本上有一个游戏,你拥有一个星球,你将船只发送到其他星球,稍后你可以拥有这个新星球。

PlanetB遭到船只攻击:

[PlanetA] ----> [PlanetB]

PlanetB被征服时船舶抵达的过程如下:

  • Planet的前任所有者必须将钱还给PlanetS的所有者(一个db事务处理T0)
  • 现在PlanetA的所有者需要创建一个新的存款(一个db事务T1)
  • 只有先前的交易成功,我们才能将Planet的所有权更改为PlanetS的所有者

请注意,事务在另一台服务器上完成,我无法在一个事务中加入它们。

基本上货币和存款都存储在数据库中,因为它们很重要(在服务器上),但游戏在内存中(在服务器上)运行。

所以问题是:

  • 如果T0由于数据库错误而失败,该怎么办,例如我收到的连接错误太多了。我可以忽略它,但不是很好,因为PlanetA的所有者将不会收到一个新拥有的星球的钱。
  • 与T1相同,事务因某些奇怪的数据库连接错误而失败。玩家甚至不会得到他的星球。将需要发送另一艘船再试一次,这不是最佳的。

我应该一遍又一遍地重试,直到什么时候,它可以阻止那艘船长时间进入这个星球。

database transactions software-design distributed-transactions
1个回答
0
投票

我认为没有一个简单的答案。所有这些听起来像db系统稍微过载,应该配置为承受更大的负载。然后一切都取决于你想要的一致性。我的第一个想法是在数据库准备好之前将数据卸载到其他存储,然后保存数据。您可以添加一些消息代理(例如zeromq),它可能能够接收一定量的数据,然后在后台(例如批量)将数据加载到数据库。或者,您可以通过将不可访问的数据库中的数据保存到服务器B上的文件(日志)来执行类似的操作。并尝试在可能的情况下将数据保存到数据库。请注意,此“解决方案”会使您的数据更改最终保持一致。我的意思是如果有一些卸载的数据,例如在日志中,您查询数据库时无法保存,用户可以在该时间点观察不同的数据状态。

© www.soinside.com 2019 - 2024. All rights reserved.