大家好我对使用3.5框架编写的.net Web服务的并发存储过程调用提出了疑问。
我正在构建一个供许多用户使用的Web服务,需要从oracle数据库返回联系信息。 问题是,当同一个用户点击同时db返回相同的联系信息时。我在SP中编写了状态更新查询。只有当2个或更多请求在状态更新发生之前读取相同记录时,我才遇到此问题。我使用了事务和事务范围,但它没有解决问题。任何人都可以告诉我,我是正确处理问题还是我应该以其他方式看待。非常感谢任何帮助。
答案 0 :(得分:1)
听起来您的存储过程代码就是我们在交易中所说的'狡猾'。
一般来说应该是
UPDATE table
SET status = 'READ'
WHERE ...
RETURNING col_1, col_2 INTO var1, var2;
RETURN;
它可能正在执行SELECT然后是基于ID的UPDATE,而不检查状态是否已被另一个事务更改
答案 1 :(得分:0)
您对数据库的“读取”操作实际上并不是读取操作,因为它会更新相关记录。听起来你需要的是第一次读取和更新操作在第二次读取和更新操作开始之前完成并提交。
我不是数据库/ oracle专家,所以如果这个答案有些模糊,我道歉:有没有办法在读取和更新操作开始时锁定有问题的表 - 也许是一个oracle事务设置?如果是这样,那就应该完成你想要的。
请注意,您实际上是对该表的单线程访问,这可能会影响性能,具体取决于并发用户的数量以及访问表的频率。您可能想要考虑实现该要求的其他方法。