簡體   English   中英

如果交易失敗怎么辦?

[英]What to do if a transaction fails?

因此,基本上,有一個游戲,您擁有一個星球,然后將飛船運送到其他星球,然后您便可以擁有該新星球。

PlanetB正在被一艘船攻擊:

[行星A] ----> [行星B]

當PlanetB被征服后,到達船的過程如下:

  • PlanetB的先前所有者必須將錢還給PlanetA的所有者(一個數據庫事務T0)
  • 現在,PlanetA的所有者需要創建一個新的存款(一個數據庫事務T1)
  • 只有上一次交易成功,我們才能將PlanetB的所有權更改為PlanetA的所有者

請注意,事務是在另一台服務器上完成的,我無法將它們都合並到一個事務中。

貨幣和存款基本上很重要,因為它們很重要(在serverA上),但游戲本身並在內存中(在serverB上)運送。

所以問題是:

  • 如果T0由於數據庫錯誤而失敗,該怎么辦,例如,我收到太多連接錯誤。 我可以忽略它,但是不好,因為PlanetA的所有者不會收到新擁有的星球的錢。

  • 與T1相同,事務因某些奇怪的數據庫連接錯誤而失敗。 玩家甚至不會得到他的星球。 將需要派另一艘船重試,這不是最佳選擇。

我應該一遍又一遍地重試,直到它阻止那艘船長時間進入地球為止。

我認為沒有一個簡單的答案。 聽起來好像db系統有點過載,應該配置為承受更大的負載。 然后,這取決於您要保持的一致性。 我的第一個想法是在數據庫准備就緒之前將數據卸載到其他存儲中,然后將數據保存在那里。 您可以添加一些消息傳遞代理(例如zeromq),該代理可能能夠接收少量數據,然后在后台(例如分批)將數據加載到數據庫。 或者,您可以通過在服務器B上無法訪問數據庫的情況下將數據保存到文件(日志)中來進行類似操作,並在可能的情況下嘗試將數據保存到數據庫中。 請注意,此“解決方案”使您的數據更改最終保持一致。 我的意思是,如果日志中有一些卸載的數據(例如,如果您查詢數據庫),則無法保存它們,此時用戶可以觀察到不同的數據狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM