網遊避免事務與回滾
(金慶的專欄)
玩家的資料可能分散在不同程序中,
例如揹包在物品管理程序,血量在戰鬥程序,公會積分在公會管理程序。
如果乙個裝備公升級功能需要扣揹包中物品,扣血,扣公會積分,然後增加裝備屬性,
需要跨多個程序更改資料,最終決定是否成功。
目前一般按事務處理,如果中間某個步驟失敗,需要回滾整個操作。
實際上可以放寬條件,避免事務處理,不需要回滾。
裝備公升級前,客戶端將預判條件是否滿足,然後裝備公升級程序再次用本地資料判斷條件,
然後依次扣物品,扣血,扣積分,所有扣除都成功後即可增加裝備屬性。
如果某個扣除失敗,將直接返回失敗結果,先前的扣除將作為損耗不再回滾。
對於玩家來說,裝備公升級將是一件有風險,不成功就會有損失的事,
玩家需要盡量保持當前狀態以避免裝備公升級失敗。
例如玩家需要在安全地點避免裝備公升級時受到攻擊,
需要在公會申請預留積分(可能是公會頻道發個通告)。
扣除物品的次序可能需要認真考慮,像公會積分不受控制容易變化的先扣,
扣血這種價值可以忽略的先扣,重要物品最後扣除以最大限度避免損失。
所有玩家可以承受的損失都不需要回滾。
事務回滾與手動回滾
一般我們在開發時,在方法或者類上加了 transactional事務註解,然後會用 try catch 將可能會出問題的 塊包起來,在catch裡面處理捕獲的異常,但是,如果在catch裡面沒有把異常丟擲去,此時事務是不會自動回滾的 比如這種情況 這裡既沒有丟擲異常,也沒有手動回滾,在插入流水表之後...
事務回滾反思
自己以後就用這個部落格了,部落格的更改給大家帶來了很多不便,以前的部落格 停用,因為對於專業的人來說應該用專業的東西,用龐大的技術去顯示it技術的魅力,顯示我們是一支龐大的力量。今天技術總結,看到師姐寫得事件回滾,自己就研究去了,看到有個for迴圈自己感覺這是正確格式麼,自己很迷信的相信然後就以這樣...
PHP PDO事務回滾
trycatch pdoexception e 事務處理 try where id 1 affected rows pdo exec sql if affected rows throw new pdoexception 張三轉出失敗 那個錯誤丟擲異常 sql update zhanghao set...