0

我们正在使用.net 中的一个应用程序,将DB2 作为数据库。我在存储过程中使用临时表。有时它会引发错误“表正在使用中”。

Declare Global Temporary Table TRNDETAILS (USERID INT ,
Name VARCHAR ( 25 )) WITH REPLACE;

根据以下文档,临时表特定于会话。那为什么显示“表正在使用中”。如何解决?

https://www.ibm.com/support/knowledgecenter/en/SS6NHC/com.ibm.swg.im.dashdb.sql.ref.doc/doc/r0003272.html

4

2 回答 2

1

SQL0913N 是锁超时或死锁。

这可能不在您的会话表中。除非您的 .net 应用程序在单个连接上执行多线程 SQL。

检查DSPRCDLCK、WRKOBJLCK相关工具。您需要跟踪发生冲突的 SQL 语句,并根据原因采取措施。有时这涉及更改应用程序中的隔离级别。

检查 Db2 for i 诊断以获取更多信息,即是锁定超时还是死锁,以及涉及哪些连接以及涉及哪些对象。

于 2018-05-11T11:58:49.023 回答
0

QTEMP 对于每个工作/连接都是独一无二的......

我假设您的应用程序只在一个地方创建临时表,并且创建临时表是它首先要做的事情之一。

我还怀疑您在.NET 中使用连接池。

因此连接实际上并没有被关闭,它在连接池中保持打开状态。

在您的应用程序的某个地方,您没有正确处理结果集和/或提交对临时表的更改。因此,当连接返回池时,其中的行将被锁定。

您可能应该在应用关闭连接并将连接返回到池之前删除临时表。

这应该可以防止错误,但最好先找出导致行锁定的错误。

于 2018-05-11T16:55:43.237 回答