【发布时间】:2019-02-13 16:13:16
【问题描述】:
我们正在设计一个带有 Oracle 后端的基于 Web 的应用程序,用于会议室预订。另外 - 我们决定使用乐观锁定,因为我们预计冲突的数量会在较低的一侧。
现在 - 在乐观锁定的情况下,总是有可能出现“数据已被其他人修改”的情况。
而且我们的 UI 涉及很多需要输入的字段。并且显示诸如“数据已被修改”之类的消息对于最终用户来说并不是一种愉快的体验;尤其是在他/她进入 15 岁以上的领域之后。
我正在考虑的是当最终用户根据他/她在 UI 上输入的前几个条目启动他/她的 UI 会话时显示“碰撞概率”。
此 CP(冲突概率)将通过考虑针对给定表/列正在进行的数据库会话来动态计算。
例如 - 如果 A 和 B 都在查看会议室 X 的信息 - 那么两者都将显示更高的 CP(碰撞概率)。
在这种情况下 - 他们中的任何一个都可以决定等待几秒钟。这比重新输入所有数据要好。
现在我的问题是:在 Oracle 中,有没有办法确定哪些会话与哪些表和 ROWID 相对?
【问题讨论】:
-
没有 Oracle 不支持 脏读。但是您可以实施 DIY 解决方案。除了 update
VERSION列之外,该列在每次提交时都会更新,并表示 来自其他会话的更新 您设置了一个 last select timestamp列,帮助您估计记录处于来自其他会话的待处理事务中的概率。 -
@MarmiteBomber - 所以每次有人选择它时你都会更新记录?事实上,如果应用程序选择了一个可用房间列表,那么这将是多个更新。这似乎相当沉重。
-
不需要那个@APC。正如您在回答中描述的那样,我会设法在用户选择房间时准确地更新记录。所以我们没有遵循完全不同的策略。如果有用户选择房间然后决定吃午饭,那么只有你的
pessimistic方法会糟糕。当然,阅读更新不会改变乐观的VERSION列。顺便说一句,我从不使用这种方法,但在我的短名单上是一个测试,看看使用这个 last read timestamp 是否有统计改进。