我们使用DB2数据库。一些数据仓库表是TRUNCATEd并且每天都重新加载。当另一个进程针对同一个表运行INSERT语句时,我们遇到死锁问题。
方案
TRUNCATE在表上执行。 同时另一个进程在同一个表中插入一些数据。(该进程基于一个触发器,可以随时启动)
有工作吗? 到目前为止我们所想的是优先考虑截断,然后使用插入来进行thruogh。有没有办法补充这个。任何帮助将不胜感激。
答案 0 :(得分:1)
在执行截断之前,您应该请求表锁。
如果这样做,你就无法获得死锁 - 在插入完成之前不会授予表锁定,一旦你有锁定,就不会发生另一次插入。
评论更新:
您可以使用 LOCK TABLE 命令。细节取决于您的情况,但您应该能够逃脱共享模式。这将允许读取但不允许插入(这是您相信的问题。)
这可能无法解决您的问题。这可能意味着你的insert语句很复杂 - 也许它是从一堆其他表或联合表中读取。如果是这种情况,请重新构建您的解决方案以包括一个临时表(首先插入到临时表中......慢慢地......然后从登台表插入到目标表中)。