如果交易失败怎么办?

时间:2018-09-05 05:24:58

标签: database transactions software-design distributed-transactions

因此,基本上有一个游戏,您拥有一个星球,然后将飞船运送到其他星球,过一会儿您便可以拥有该新星球。

PlanetB被一艘船袭击:

[PlanetA] ----> [PlanetB]

PlanetB被征服后到达船的过程如下:

  • PlanetB的先前所有者必须将钱还给PlanetA的所有者(一次数据库事务T0)
  • 现在,PlanetA的所有者需要创建一个新的存款(一个数据库事务T1)
  • 只有上一次交易成功,我们才能将PlanetB的所有权更改为PlanetA的所有者

请注意,事务是在另一台服务器上完成的,我无法将它们都合并到一个事务中。

基本上,钱和存款很重要,因为它们很重要(在serverA上),但是游戏本身并在内存中(在serverB上)运送。

所以问题是:

  • 如果T0由于数据库错误而失败,该怎么办,例如,我收到太多连接错误。我可以忽略它,但是不好,因为PlanetA的所有者不会收到新拥有的星球的钱。

  • 与T1相同,事务因某些奇怪的数据库连接错误而失败。玩家甚至不会得到他的星球。需要发送另一艘船重试,这不是最佳选择。

我应该一遍又一遍地重试此操作,直到它阻止该船长时间进入行星。

1 个答案:

答案 0 :(得分:0)

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

相关问题