0

据记载,在 DB2 中,TRUNCATE 语句与在线备份不兼容,因为它会在表上获得 Z 锁并阻止在线备份同时运行。当截断尝试获取内部在线备份对象上的共享锁时,会发生锁等待。

由于这是产品中的设计,我将不得不寻求解决方法,所以这个线程不是关于解决方案,而是为什么它们不能一起工作。我没有找到合理的解释为什么在 db2 中有这样的限制。

有什么见解吗?

谢谢,卢西亚诺莫雷拉

4

1 回答 1

0

来自http://www.ibm.com/developerworks/data/library/techarticle/dm-0501melnyk/

当一个表持有 Z 锁时,没有并发应用程序可以读取或更新该表中的数据。

所以现在我们知道 Z 锁是对表的独占访问,拒绝对表的读写访问。

来自 http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0053474.html

独占访问:没有其他会话可以在表上打开游标或在表上持有锁 (SQLSTATE 25001)。

来自https://sites.google.com/site/umeshdanderdbms/difference-between-truncate-and-delete

  1. 删除是记录操作,其中截断是使表在容器级别为空。(记录操作——DML 操作被记录到日志中(oracle 中的重做日志、DB2 中的事务日志等)。它存储在日志中以进行提交或回滚操作。)

这是最有趣的部分。截断只是“忘记”表的内容,而删除删除逐行处理所有触发器、铃声和口哨。因此,当您截断所有阅读游标时,将变得无效。为了防止出现这种愚蠢的事情,您只能在没有人尝试访问时完全清空表。在线备份显然需要读表。因此,不可能同时访问同一个表。

于 2013-10-23T14:49:35.530 回答