网游避免事务与回滚
(金庆的专栏)
玩家的数据可能分散在不同进程中,
例如背包在物品管理进程,血量在战斗进程,公会积分在公会管理进程。
如果一个装备升级功能需要扣背包中物品,扣血,扣公会积分,然后增加装备属性,
需要跨多个进程更改数据,最终决定是否成功。
目前一般按事务处理,如果中间某个步骤失败,需要回滚整个操作。
实际上可以放宽条件,避免事务处理,不需要回滚。
装备升级前,客户端将预判条件是否满足,然后装备升级进程再次用本地数据判断条件,
然后依次扣物品,扣血,扣积分,所有扣除都成功后即可增加装备属性。
如果某个扣除失败,将直接返回失败结果,先前的扣除将作为损耗不再回滚。
对于玩家来说,装备升级将是一件有风险,不成功就会有损失的事,
玩家需要尽量保持当前状态以避免装备升级失败。
例如玩家需要在安全地点避免装备升级时受到攻击,
需要在公会申请预留积分(可能是公会频道发个通告)。
扣除物品的次序可能需要认真考虑,像公会积分不受控制容易变化的先扣,
扣血这种价值可以忽略的先扣,重要物品最后扣除以最大限度避免损失。
所有玩家可以承受的损失都不需要回滚。
(金庆的专栏)
玩家的数据可能分散在不同进程中,
例如背包在物品管理进程,血量在战斗进程,公会积分在公会管理进程。
如果一个装备升级功能需要扣背包中物品,扣血,扣公会积分,然后增加装备属性,
需要跨多个进程更改数据,最终决定是否成功。
目前一般按事务处理,如果中间某个步骤失败,需要回滚整个操作。
实际上可以放宽条件,避免事务处理,不需要回滚。
装备升级前,客户端将预判条件是否满足,然后装备升级进程再次用本地数据判断条件,
然后依次扣物品,扣血,扣积分,所有扣除都成功后即可增加装备属性。
如果某个扣除失败,将直接返回失败结果,先前的扣除将作为损耗不再回滚。
对于玩家来说,装备升级将是一件有风险,不成功就会有损失的事,
玩家需要尽量保持当前状态以避免装备升级失败。
例如玩家需要在安全地点避免装备升级时受到攻击,
需要在公会申请预留积分(可能是公会频道发个通告)。
扣除物品的次序可能需要认真考虑,像公会积分不受控制容易变化的先扣,
扣血这种价值可以忽略的先扣,重要物品最后扣除以最大限度避免损失。
所有玩家可以承受的损失都不需要回滚。