作者danielguo (Daniel Guo)
看板Database
标题Re: 请教一下资料库同步的问题
时间Wed Oct 5 14:57:48 2011
如果是我的话可能会这样做. 资料库 transaction 的时间越短越好,
不会放入和使用者互动的部分
※ 引述《lancer7 (158)》之铭言:
: 假设一个订票系统有一个table:座位
: 栏位有日期、座位号码、是否available、订位人的ID
: 现在有两个user: A, B进入了订票系统
: 接着发生了以下事件
: 1. A select此table发现有五个空位
: 2. B select此table发现有五个空位
3. A 点选了四个位置, 并点下一步或确定
4. begin; lock 位子 table 此场次的 row; 检查四个位置=>无人;
更新四个位置状态为已定位; commit;
5. B 点选了两个位置, 并点下一步或确定
6. begin; lock 位子 table 此场次的 row; 检查两个位置=>有人;
中止 transaction;
7. 和 B 说此位置已有人选取
: 3. A 订了四个位子,并且把这四个位子的状态update为unavailable
: 4. A结束transaction
: 5. 现在B以为有五个空位,於是订了两个位子 => 发生重复订位的问题
: 请问一下,有什麽办法解决这个同步的问题?
: 我想到的方法是在事件1发生时让A对table作lock,然後B要等到A结束transaction
: 才能select
: 不过这方法效率似乎不好,有更好的方法吗?
一定不能这样做, 不然系统会变成同时间单人限定
基本上在还没选位时 lock 行不通. 例如 A 进入画面看到 500 个位置, 而他只需要一个
系统无法预测他想要哪个, 也不可能把全部 500 个都先 lock 起来 (变成单人系统)
如果要减少选位被人家订走的情形, 可以定时重新查询资料库来更新画面
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 24.19.233.135
※ 编辑: danielguo 来自: 24.19.233.135 (10/05 14:59)
1F:推 iamnotfat:感谢分享 受教了 10/06 18:42