瞬间截断和插入同一张表
Posted
技术标签:
【中文标题】瞬间截断和插入同一张表【英文标题】:Truncating And Inserting on the same table at an instant 【发布时间】:2016-05-27 07:43:44 【问题描述】:我们使用 DB2 数据库。一些数据仓库表每天都会被截断并重新加载。当另一个进程对同一张表运行 INSERT 语句时,我们会遇到死锁问题。
场景
TRUNCATE 在表上执行。 同时另一个进程在同一张表中INSERTS一些数据。(该进程基于触发器,可以随时启动)
有解决办法吗? 到目前为止,我们的想法是优先考虑截断,然后通过插入。有什么办法可以实现这一点。任何帮助将不胜感激。
【问题讨论】:
我的理解是,如果两个进程都做其他一些需要额外锁的工作,你只能在上述情况下遇到死锁。 TRUNCATE 过程是在做这个还是做更多? 截断只是截断另一个进程试图将记录插入@data_henrik的同一张表的记录 业务规则是什么很重要 - 哪个流程具有优先级 - 这非常重要,无论如何都应该顺序化以获得可重现的输出 插入语句优先。永远不会发生插入数据和删除并行表的情况。 @MichaelTiefenbacher 【参考方案1】:您应该在执行截断之前请求一个表锁。
如果你这样做,你就不会出现死锁——在插入完成之前不会授予表锁,一旦你获得了锁,就不会发生另一个插入。
评论更新:
您可以使用 LOCK TABLE 命令。细节取决于您的情况,但您应该也可以使用共享模式。这将允许读取但不允许插入(我相信这是您遇到的问题。)
这可能无法解决您的问题。这可能意味着您的插入语句很复杂——也许它正在从一堆其他表或联合表中读取。如果是这种情况,请重新构建您的解决方案以包含一个临时表(首先插入临时表..慢慢地..然后从临时表插入到目标表中)。
【讨论】:
能否请您详细告诉我该过程。实际上是这个数据库的新手 命令是 LOCK TABLE以上是关于瞬间截断和插入同一张表的主要内容,如果未能解决你的问题,请参考以下文章