Database 如果事务失败怎么办?

Database 如果事务失败怎么办?,database,transactions,software-design,distributed-transactions,Database,Transactions,Software Design,Distributed Transactions,所以基本上有一个游戏,你拥有一颗行星,你把船送到其他行星,一点之后你可以拥有那颗新行星 PlanetB正被一艘船袭击: [PlanetA]--->[PlanetB] 当飞机被征服时,船舶到达的过程如下: PlanetB的前所有者必须向PlanetA的所有者偿还款项(一笔db交易T0) 现在PlanetA的所有者需要创建一个新的存款(一个db事务T1) 只有在上一笔交易成功的情况下,我们才能将PlanetB的所有权更改为PlanetA的所有者 请注意,事务是在另一台服务器上完成的,我不能在一个

所以基本上有一个游戏,你拥有一颗行星,你把船送到其他行星,一点之后你可以拥有那颗新行星

PlanetB正被一艘船袭击:

[PlanetA]--->[PlanetB]

当飞机被征服时,船舶到达的过程如下:

  • PlanetB的前所有者必须向PlanetA的所有者偿还款项(一笔db交易T0)
  • 现在PlanetA的所有者需要创建一个新的存款(一个db事务T1)
  • 只有在上一笔交易成功的情况下,我们才能将PlanetB的所有权更改为PlanetA的所有者
请注意,事务是在另一台服务器上完成的,我不能在一个事务中同时加入它们

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

因此,问题是:

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

  • 与T1相同,事务因某些奇怪的db连接错误而失败。玩家甚至无法得到他的星球。需要派另一艘船再试一次,这不是最佳选择


我应该一次又一次地重试,直到它能阻止那艘船长时间进入这个星球。

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

将管理资金,因此需要100%可靠:)问题是如果您错过了这条船(当您征服一个星球时,交易失败)那你根本就不拥有那颗行星。你需要派另一艘船去征服。这会对比赛产生一些影响。而且我不能让整个游戏等到交易完成。。。所以问题是我不能在以后处理这个操作,因为它没有意义。例如,在以后的某个时间,这个星球被另一个用户拥有,或者发生了一些其他的事情。只是出于兴趣,如果你错过了这条船,那么你就不拥有这个星球,但你不会损失金钱,对吗?尽管如此,我的观点是,如果您使用数据库作为真相的来源,那么它就是基础设施的“同步点”,也是所有操作所依赖的瓶颈。如果这是一个点,也许你应该考虑以某种方式将数据加载拆分到数据库-例如一些不那么重要的查询可以卸载到某个侧数据库,并且主数据库可以有更多的资源用于资金释放事务。是的,所以基本上,首先将设法存钱,如果它成功了,你将拥有这个星球。是的,我可以卸载,但目前正在做这件事,身份验证,是目前的一小部分。问题是如何处理失败的事务