问题描述
你好,
我们有一个带有记录的表,其中包含必须批量填写的值,并且应该由客户端应用程序使用。
各种会话应读取并删除一条记录,并且必须保证只有一个会话使用一条记录。
我们尝试使用select进行更新,但存在锁定问题。
有没有另一种方法来 “消费” 记录,并具有只有会话获得相同记录的安全性?
问候
安德烈亚斯
我们有一个带有记录的表,其中包含必须批量填写的值,并且应该由客户端应用程序使用。
各种会话应读取并删除一条记录,并且必须保证只有一个会话使用一条记录。
我们尝试使用select进行更新,但存在锁定问题。
有没有另一种方法来 “消费” 记录,并具有只有会话获得相同记录的安全性?
问候
安德烈亚斯
专家解答
默认情况下,Oracle数据库具有语句级一致性。这意味着查询只能看到查询开始时提交的更改。
如果你有
同时运行的两个会话将选择同一行。
选择更新是为了帮助避免这个问题。第一个会话中的查询将阻止第二个会话,直到事务完成。这将导致某些会话相互阻塞,并且很难避免。
Is there another way to "consume" the records and have the security that only session gets the same record?
如果你想确保一行只被一个会话读取,我怀疑你想使用高级排队。如果你进一步解释why您正在尝试这样做,并给出我们可以进一步帮助的工作代码示例。
如果你有
select ... from tab delete tab ...
同时运行的两个会话将选择同一行。
选择更新是为了帮助避免这个问题。第一个会话中的查询将阻止第二个会话,直到事务完成。这将导致某些会话相互阻塞,并且很难避免。
Is there another way to "consume" the records and have the security that only session gets the same record?
如果你想确保一行只被一个会话读取,我怀疑你想使用高级排队。如果你进一步解释why您正在尝试这样做,并给出我们可以进一步帮助的工作代码示例。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




