瞬间截断和插入同一张表

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 in EXCLUSIVE MODE - 详情见ibm.com/support/knowledgecenter/SSEPGG_10.5.0/…,别忘了再次释放它

以上是关于瞬间截断和插入同一张表的主要内容,如果未能解决你的问题,请参考以下文章

审计截断和丢弃

BigQuery:404“表被截断。”在截断后立即插入时

sqlserver插入语句报“将截断字符串或二进制数据”怎么解决,怎么回事?

我的 Sql Bulk 插入加载数据并截断

SQL在插入时如何截断数据?

sql怎么插入日期类型数据报将截断字符串或二进制数据