在Db2中,我们假设我们在表t1中插入数据。同时,另一个进程尝试截断表中的数据。 truncate会等待插入完成吗?或者是否有可能出现死锁
答案 0 :(得分:0)
在执行截断之前,您应该请求表锁。
如果这样做,你就无法获得死锁 - 在插入完成之前不会授予表锁定,一旦你有锁定,就不会发生另一次插入。
您可以使用LOCK TABLE命令。细节取决于您的情况,但您应该能够逃脱共享模式。这将允许读取但不允许插入(这是您相信的问题。)
这可能无法解决您的问题。这可能意味着你的insert语句很复杂 - 也许它是从一堆其他表或联合表中读取。如果是这种情况,请重新构建您的解决方案以包括一个临时表(首先插入到临时表中......慢慢地......然后从登台表插入到目标表中)。
答案 1 :(得分:0)
首先,我会质疑任何设计,其中一个进程可能会截断一个表而另一个进程会插入记录。
其次,鉴于你所描述的内容,没有机会出现僵局。您可能会收到“正在使用的对象”消息(可能是SQL State = 57033)。但这与死锁不一样。
当P1锁定T1并且P2锁定T2时发生死锁。然后P1尝试锁定T2,而P2尝试锁定T1。现在,两个进程都在等待另一个进程完成,然后才能继续。 T1和T2可以是表格,记录,任何资源。
即使在死锁场景中,大多数进程也只愿意等待一段时间才能获得资源。取消之前再次尝试。如果两个进程都愿意永远等待,则死锁只是一个问题。现在你的RDBMS必须检测到死锁并选择一个进程来杀死。