【发布时间】:2016-06-03 08:09:56
【问题描述】:
在 Db2 中,假设我们在表 t1 中插入数据。同时另一个进程试图从表中截断数据。截断会等待插入完成吗?还是会有死锁的可能
【问题讨论】:
在 Db2 中,假设我们在表 t1 中插入数据。同时另一个进程试图从表中截断数据。截断会等待插入完成吗?还是会有死锁的可能
【问题讨论】:
您应该在执行截断之前请求一个表锁。
如果你这样做,你就不会出现死锁——在插入完成之前不会授予表锁,一旦你获得了锁,就不会发生另一个插入。
您可以使用 LOCK TABLE 命令。细节取决于您的情况,但您应该也可以使用共享模式。这将允许读取但不允许插入(我相信这是您遇到的问题。)
这可能无法解决您的问题。这可能意味着您的插入语句很复杂——也许它正在从一堆其他表或联合表中读取。如果是这种情况,请重新构建您的解决方案以包含一个临时表(首先插入临时表..慢慢地..然后从临时表插入到目标表中)。
【讨论】:
首先,我会质疑任何一个进程可能截断表而另一个进程正在插入记录的设计。
其次,鉴于您所描述的情况,不会出现死锁。您可能会收到“正在使用的对象”消息(可能是 SQL 状态 = 57033)。但这与死锁不同。
当 P1 锁定 T1 并且 P2 锁定 T2 时发生死锁。然后 P1 尝试锁定 T2,而 P2 尝试锁定 T1。两个进程现在都在等待对方完成,然后才能继续。 T1 和 T2 可以是表、记录、任何资源。
即使在死锁情况下,大多数进程也应该只愿意为资源等待一定的时间。在取消并重试之前。如果两个进程都愿意永远等待,死锁只是一个问题。现在您的 RDBMS 必须检测到该死锁并选择一个要杀死的进程。
【讨论】: