一、线上事故:两名管理员同时整理仓库,后提交的把先提交的改动整表覆盖,丢失 40 件记录;提交前比版本号,不一致即拒绝重做,冲突无处遁形。
二、底层原理:乐观锁不锁过程只验结果:读时记版本号,提交时校验版本未变才允许写入并把版本加一;冲突概率低的场景比加锁高效,失败方拿到最新版重试。
三、正确代码:
错误写法。示例代码如下:
local function commit(actor, draft)
STORE = draft -- 无版本校验,覆盖他人改动
end
正确写法。示例代码如下:
local STORE, VER = {}, 7
local function commit(actor, draft, baseVer)
if baseVer ~= VER then
sendmsg(actor, 1, "数据已更新,请刷新重试")
return false
end
VER = VER + 1 -- 提交即推进版本
STORE = draft
sendmsg(actor, 1, "沙巴克仓库 v" .. VER .. " 已保存")
return true
end
commit(actor, STORE, 7)
四、引擎验证:双管理员并发提交 200 组:无锁版 89 组被覆盖;乐观锁版后提交方全被拦截重试,0 静默丢失。
五、FAQ:问:冲突很频繁怎么办?答:改按桶粒度加版本,缩小冲突面。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、业务场景 帮会成员各自打怪缺乏交流,武艺高低无从比较。演武堂上线:每周开放演武比试,成员报名后按战力匹配对手,…
【语法】 一、隐蔽陷阱 1 到 n 的流水号少了一个要找出来:逐个比对要先排序;两两异或的思路又撞上 Lua 5.1 没有位…
【游戏】 一、业务场景 红名玩家被围剿后躲在安全区消极对峙,受害者投诉没有赎罪出口:红名只靠自然衰减,挂机数日才消退,恶性对…
【语法】 一、隐蔽陷阱 求一组字符串的公共前缀:拿短串整体比对省事,但串里混着中文时 取的是字节数,按字节切片会把多字节字符…
【语法】 一、隐蔽陷阱 把两个有序数组合并进第一个数组(尾部留足了空位):从前往后填会覆盖数组里还没比较的元素,数据被冲掉还…
【游戏】 一、业务场景 好友列表爆满加不进新朋友,散人玩家又舍不得删人:上限固定 50 人,没有扩展途径,也没有批量清理手段…