【发布时间】:2017-03-10 01:12:10
【问题描述】:
我们面临以增量方式访问 Oracle 行的问题,表架构是-
myTable(UniqueNum,flag)
UniqueNum 是数字不重复的字段,flag 是默认值为 F 的字段。
我的编程步骤是:
-
获取标志为 F 的 UniqueNum。
select min(UniquaNum) from myTable where flag='F'; 执行操作。
一些操作(comport上的通信)
-
将标志设置为 T。
Update myTable set flag='T' where flag='F' and UniqueNum= 'UN'
我开发了一个执行这些步骤的 exe (Delphi-7)。当 exe 同时在多台 PC 上运行时会出现此问题。许多 exe 获取相同的 UniqueNum(第 1 步),但其中只有一个 exe 可以执行所有 3 个步骤。
假设 PC1 选择13 并执行步骤 2,此时 PC2 执行步骤 1 然后它也会获取13。那么对于 PC2,我的第 3 步将失败。
我想知道,是否有一些机制可以避免这种类型的获取(行锁或表锁)?
谁能提出更好的解决方案来避免这种并发?如何在 Delphi 或 C# 中实现相同的功能?
【问题讨论】:
-
这些步骤的代码示例在哪里:1、2、3?究竟是什么问题?别人被锁了?
to avoid such type of fetching究竟是什么类型的获取?您使用的是什么版本的 oracle? -
我使用的是 Oracle 9i,步骤也是 - Step1 select min(UniquaNum) from myTable where flag='F';第 2 步 - 一些操作(comport 上的通信) 第 3 步 - 更新 myTable set flag='T' where flag='F' and UniqueNum= 'UN' 假设 PC1 选择 13 并执行步骤 2,此时 PC2 执行 step1那么它也会获取 13。然后我的 step3 将在 PC2 上失败。
-
will be failed for PC2定义失败。是否被锁定(如果您的第一个会话在第 3 步之后未提交,我假设它会锁定)或显示错误? -
您可以创建一个存储过程来返回唯一编号的值。看起来这就是你的逻辑所在。确保在完成获取后立即将标志设置为另一个状态,以避免其他请求返回相同的值。