用于并发处理数据库条目的z/os cics db2 cobol程序

ejk8hzay  于 2022-11-07  发布在  DB2
关注(0)|答案(3)|浏览(176)

我有一个DB2表,其中包含大量要通过MQ发送到外部系统的记录。表中有一列包含记录状态(已发送或待发送)。
我编写了一个调度程序,用于不断检查表中是否有“等待发送”的记录。如果有,程序将发送等待发送的记录,并相应地更新状态
该计划将在多个事务中启动。因此,我预计同一程序的多个示例将并发运行
我的问题是如何防止相同的记录被多个调度程序同时拾取和发送?
我被告知使用行级锁游标??但我不确定这是如何工作的
备注:我正在z/os环境下进行CICS COBOL的工作

bmvo0sr5

bmvo0sr51#

我认为您遇到了一个设计问题。我们通过在DB2表上设置一个触发器来完成类似的工作,该触发器将MQ消息发送到一个队列,该队列被定义为触发CICS事务。
在您的情况下,您可能完全可以省去CICS,而只是按照@BillWoodger的建议进行操作,并在设置pending标志时发送消息。

cbeh67ev

cbeh67ev2#

1)确定大型DB2表的聚类索引2)然后让程序的不同示例运行,只查看该聚类索引的不同部分。例如,如果聚类索引位于唯一的数字ID字段上,例如帐户ID,且ID大小为整数9,而不是让示例1查看帐户ID范围为0 - 099999999和示例2查看从100000000到1999999999的帐户ID范围,以及.....
这样你就可以写一个hold的自定义错误,根据需要执行更新和提交。

k10s72fa

k10s72fa3#

CICS将为您协调SQL事务和DB2。您运行的每个CICS事务都将能够选择和锁定更新行,DB2可以在所有这些事务之间进行协调,并防止选择多个记录,如果您执行以下两项操作的话。
当读取符合条件的行时,使用SELECT FOR UPDATE类型操作,这将锁定检索到的每一行,并防止其它并发事务访问同一行(还要求绑定行级锁,除非您希望锁定整页,请咨询DBA以了解基于行大小的选项)。
在释放记录或结束CICS事务之前,必须将所述记录标记为“sent”,以便其他等待的并发事务不会抓取它们并再次发送它们。这可以像在表中添加一个sent Y/N列并在select where子句中添加“AND sent〈〉'Y'”一样简单。在发送记录之后,在这些记录上执行UPDATE并设置sent = 'Y'。根据行数据,您可能会使用其他内容,如发送时间或其他内容,它只需要是将从重选中排除所述行的内容。

相关问题