【发布时间】:2014-12-09 23:14:26
【问题描述】:
我目前正在开发一个使用 COBOL 连接到 DB2 的系统。示例浏览将由以下语句启动:
EXEC SQL
DECLARE <cursor name> CURSOR FOR
SELECT
<field names>
FROM <table name>
WHERE
<conditions>
ORDER BY
<key fields>
FOR FETCH ONLY
OPTIMIZE FOR 1 ROW
END-EXEC.
EXEC SQL
OPEN <cursor name>
END-EXEC.
一旦确定浏览成功,将使用以下命令对表进行后续读取:
EXEC SQL
FETCH <cursor name>
INTO
<variable names>
END-EXEC.
例如,如果我正在浏览一个表并且返回的结果集大约有 100,000 行,则需要数小时来处理。如果我可以确保系统的其他用户在我正在浏览的同一个表上进行处理时不会遇到死锁 (-911),那就没问题了(处理意味着选择、更新和可能删除记录)。
如何确定我正在执行的浏览操作是否可能导致其他用户死锁?
(注意:我没有做任何更新,只是纯粹检索数据)
【问题讨论】:
-
您在大型机上运行。为什么你会认为处理它需要“几个小时”?在测试数据库上尝试。与您的同事交谈。询问您的 DBA。在可能出现死锁的情况下,他们会知道您应该如何处理它,并且他们可以更好地展示可能没有死锁的地方。
-
在 CICS 中,100,000 行是否要在一个事务中处理?一旦开始超过几秒钟,我会担心这会被标记为长时间运行的事务。在这些情况下仍会发生锁升级。从表面上看,对于 UR 甚至 CS,您更有可能成为受害者。如果这是一项架构任务,是否可以从间隔控制分批完成?还是从批次?是否有可以在 Query 中执行的逻辑?分页?
标签: sql db2 deadlock cobol cics