【问题标题】:Tables being affected by current transactions in Oracle受 Oracle 中当前事务影响的表
【发布时间】: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 是否有统计改进。

标签: oracle plsql


【解决方案1】:

“我们的 UI 涉及到很多需要输入的字段。”

这似乎是可以通过更好的流程解决的问题。尽量减少用户需要输入的字段数量,然后才能获得可用的合适房间列表。当他们选择房间时,使用悲观锁定以确保在他们完成预订申请时没有其他人可以抢走房间。存储初始字段的副本,以便他们改变主意时可以重新运行原始查询。

当然,这意味着维护会话和处理状态,我们都知道 Web 应用程序在这方面很糟糕。这是一种说法,当它们不适合我们正在编写的应用程序时,我们经常使用 Web 技术。

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 2017-04-01
    • 2013-12-03
    • 2011-01-20
    • 1970-01-01
    • 2011-11-11
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多