作者satansss (从哪里开始从哪里结束)
看板MapleStory
标题[闲聊] 浅谈交易复原
时间Wed Aug 10 11:39:31 2011
每年的寒暑假都是游戏的传统旺季,这样的时节经常会看到XX伺服器大断线,重登後发现
系统回溯,或是身上的宝物变成两倍或是宝物消失之类的情形,本文就尝试以资料库管理
的角度来解释这样的现象。首先必须先介绍几个名词:
1.交易:一串动作的集合,为资料库管理的最小执行单位,例如开启仓库,然後领一张强
化卷,然後存一把火尖枪,然後关闭仓库,以上从开启仓库到关闭仓库的过程,
即为一个交易
2.动作:一个改变资料库状态的事件,例如喝一罐超水、点一张强化卷、放一样道具进仓
库都是一个动作
3.确认点:系统定时将日志的记录写入硬碟,以确保交易的永久有效,此时间点即是确认
点
4.复原:系统发生非毁灭性的灾害,例如当机,必须将系统回复成当机前的状态,即一般
所谓的回溯
5.REDO:重做或是往前做,比如有一个交易依序执行以下动作
+100火尖枪(卷5)=>点60%枪卷(过+102卷4)=>点60%枪卷(过+104卷3)=>
点60%枪卷(炸+104卷2)=>点10%枪卷(过+109卷1)=>点10%枪卷(炸+109卷0)
则进行REDO时,火尖枪的状态会从一开始的+100卷5,依序重新变成+102卷4,
+104卷3,+104卷2,+109卷1,+109卷0
5.UNDO:往回做或回头做,以上例来说的话,火尖枪的状态会从+109卷0依序变成+109卷1
,+104卷2,+104卷3,+102卷4,+100卷5
基本上枫之谷使用的交易复原机制应该是即时更新,系统运作的过程中会建立一个UNDO串
列,以及一个REDO串列,当系统发生CRASH时,UNDO串列中的交易进行UNDO,REDO串列中
的交易进行REDO,举例来说有两个交易T1与T2进行过程如下
time
a----b------------c-----------d------->
|
T1 |------------| |
T2 |-----------------------------|
时间点 UNDO串列 REDO串列 说明
a. T2 null T2交易开始时加入UNDO串列
b. T1,T2 null T1交易开始时加入UNDO串列
c. T2 T1 T1交易结束移至REDO串列
d. T2 T1 系统CRASH,复原机制启动
直接以枫之谷的实例来说好了,我们可以把T1看做是仓库的开(b点)到关(c点)或是商店的
开到关,把T2看做是人物的登入(a点)到大断线(d点)。今天有个玩家阿跟登入之後去开启
仓库,然後领出一把+153蓝色滑雪板,然後关闭仓库,之後过了三分钟大断线。阿跟重登
之後,系统将仓库的存取交易REDO,於是仓库重做到没有蓝色滑雪板的状态,将人物身上
的道具存取交易UNDO,於是人物身上回复成没有滑雪板的状态,於是阿跟哭哭,打电话去
客服抱怨,听了半小时的嘎骂泥亚音乐之後,得到系统一切正常,有问题请至客服信箱反
应的回覆,然後就陷入客服与信箱的无限循环~~~
以上後半段纯属虚构,单纯是想表达出宝物消失的人的无奈罢了。总之宝物会消失就是出
现以上的情形,玩家自保的方式就是,当你把宝物领出仓库或是拿出精灵商人,下一个动
作就是马上登出,因为人物登出的话会启动确认点,即可以确保宝物的最後位置,不会无
故消失。相信看到这边,聪明的玩家应该可以反推出复制宝物的方法,由於牵涉到道德层
面,故本文不多做赘述,有兴趣的人请自行揣摩,勿站内信,谢谢各位,阿跟下台一鞠躬
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.169.96.37
※ 编辑: satansss 来自: 218.169.96.37 (08/10 11:48)
1F:推 opthr1215:我觉得你写错了 08/10 11:45
愿闻其详 :)
2F:→ opthr1215:伺服器存档不是线性的 所以才可能发生复制的情形 08/10 11:45
3F:推 aliangh:我还是觉得 断线是人为的 原因只有造成断线的人知 目的就 08/10 11:47
4F:→ aliangh:是要复制东西罗 08/10 11:48
5F:推 blblblbl:存仓下线不一定会存档耶0.0 08/10 11:49
6F:→ x000032001:即时存档的话 不会造成不停I/O 效能低落吗? 08/10 11:53
我有提到即时存档吗0.0
※ 编辑: satansss 来自: 218.169.96.37 (08/10 11:56)
7F:→ x000032001:楼上4bl说的 我只是提出疑问 不要这样质问我嘛~"~ 08/10 12:00
8F:推 blblblbl:我不是质疑啦...QAQ 因为之前有人存仓下线也是回溯 08/10 12:09
9F:推 mister12:通常游戏就是下线存档吧 不然就是有下线前倒数的设定 08/10 12:11
10F:→ mister12:但是枫谷好像下线的时候偶尔会出现问题 看似正常下线 08/10 12:12
11F:→ mister12:但有没有存到就不一定了 08/10 12:12
12F:→ x000032001:原PO说logout会有check point阿 但是我认为只是丢进 08/10 12:14
13F:→ x000032001:buffer 每隔一段时间或是buffer满才存档 08/10 12:15
14F:→ x000032001:就是阶层式记忆体的观念啦.. 08/10 12:16
15F:→ DarkPrincex:感觉上有问题,REDO串列基本上不需要,因为已经存档了 08/10 13:20
16F:→ DarkPrincex:若是说存档太花时间,那redo串列存下来也要花时间 08/10 13:21
17F:→ DarkPrincex:如果redo没有存进资料,只是在记忆体,那会跟当机消失 08/10 13:21
18F:推 illreal:为什麽仓库就要写成redo 人物就写成undo 08/10 14:20
19F:推 daisan:其实上线才是存档..... 进拍卖也可..... 但重点是抓对时间 08/10 15:18
20F:推 HermesKing:可是前几天菇宝大回溯 我有一直上上下下...O_Q 08/10 15:30
21F:推 Sephiroth:如果伺服器不稳造成当机 甚麽存档都没有 因为根本不知道 08/10 17:03
22F:→ Sephiroth:他会回到稍早哪个系统稳定的状态 每个人回溯的点可能也 08/10 17:04
23F:→ Sephiroth:会不太一样 08/10 17:04
24F:→ leafwind:登出不能保证不会回溯 资料可能还没写入备份 08/11 02:58