在提交时更新以避免死锁

时间:2013-08-14 16:54:32

标签: sql oracle deadlock

我有一个表跟踪另一个表的分区的上次更新时间,因此我们的协调程序只需要检查自上次协调以来已更新的分区。有多个线程更新分区表,因此每次多次更新最新更新时间表的同一行。这显然会造成死锁。有没有办法通过仅在提交时更新一次来防止这些死锁?

我在考虑使用会话本地临时表,但不确定如何在提交时将值传输到全局表。

1 个答案:

答案 0 :(得分:3)

无法在提交时触发进程,因此该方法可能无效。

潜在地,您可以让每个编写器进程写入Oracle高级队列(AQ),然后使用另一个进程对消息进行解除队列并将其实际应用于当前表。这意味着编写器会话提交和AQ处理器提取和处理消息之间会有一些延迟,但这种延迟不应太长。您可以通过将每个编写器线程插入到类似队列的表中并且如果您不想使用AQ而具有该表的单独线程进程来执行相同的操作。

但是,我很困惑,你所描述的过程如何导致死锁。你真的在谈论死锁(即抛出ORA-00060错误并生成死锁跟踪文件)?您所描述的内容应该导致阻止锁定,而不是死锁,除非您发生的事情比您告诉我们的更多。