我有一个DB2表,其中包含大量要通过MQ发送到外部系统的记录。表中有一列包含记录状态(已发送或待发送)。我编写了一个调度程序,用于不断检查表中是否有“等待发送”的记录。如果有,程序将发送等待发送的记录,并相应地更新状态该计划将在多个事务中启动。因此,我预计同一程序的多个示例将并发运行我的问题是如何防止相同的记录被多个调度程序同时拾取和发送?我被告知使用行级锁游标??但我不确定这是如何工作的备注:我正在z/os环境下进行CICS COBOL的工作
bmvo0sr51#
我认为您遇到了一个设计问题。我们通过在DB2表上设置一个触发器来完成类似的工作,该触发器将MQ消息发送到一个队列,该队列被定义为触发CICS事务。在您的情况下,您可能完全可以省去CICS,而只是按照@BillWoodger的建议进行操作,并在设置pending标志时发送消息。
cbeh67ev2#
1)确定大型DB2表的聚类索引2)然后让程序的不同示例运行,只查看该聚类索引的不同部分。例如,如果聚类索引位于唯一的数字ID字段上,例如帐户ID,且ID大小为整数9,而不是让示例1查看帐户ID范围为0 - 099999999和示例2查看从100000000到1999999999的帐户ID范围,以及.....这样你就可以写一个hold的自定义错误,根据需要执行更新和提交。
k10s72fa3#
CICS将为您协调SQL事务和DB2。您运行的每个CICS事务都将能够选择和锁定更新行,DB2可以在所有这些事务之间进行协调,并防止选择多个记录,如果您执行以下两项操作的话。当读取符合条件的行时,使用SELECT FOR UPDATE类型操作,这将锁定检索到的每一行,并防止其它并发事务访问同一行(还要求绑定行级锁,除非您希望锁定整页,请咨询DBA以了解基于行大小的选项)。在释放记录或结束CICS事务之前,必须将所述记录标记为“sent”,以便其他等待的并发事务不会抓取它们并再次发送它们。这可以像在表中添加一个sent Y/N列并在select where子句中添加“AND sent〈〉'Y'”一样简单。在发送记录之后,在这些记录上执行UPDATE并设置sent = 'Y'。根据行数据,您可能会使用其他内容,如发送时间或其他内容,它只需要是将从重选中排除所述行的内容。
3条答案
按热度按时间bmvo0sr51#
我认为您遇到了一个设计问题。我们通过在DB2表上设置一个触发器来完成类似的工作,该触发器将MQ消息发送到一个队列,该队列被定义为触发CICS事务。
在您的情况下,您可能完全可以省去CICS,而只是按照@BillWoodger的建议进行操作,并在设置pending标志时发送消息。
cbeh67ev2#
1)确定大型DB2表的聚类索引2)然后让程序的不同示例运行,只查看该聚类索引的不同部分。例如,如果聚类索引位于唯一的数字ID字段上,例如帐户ID,且ID大小为整数9,而不是让示例1查看帐户ID范围为0 - 099999999和示例2查看从100000000到1999999999的帐户ID范围,以及.....
这样你就可以写一个hold的自定义错误,根据需要执行更新和提交。
k10s72fa3#
CICS将为您协调SQL事务和DB2。您运行的每个CICS事务都将能够选择和锁定更新行,DB2可以在所有这些事务之间进行协调,并防止选择多个记录,如果您执行以下两项操作的话。
当读取符合条件的行时,使用SELECT FOR UPDATE类型操作,这将锁定检索到的每一行,并防止其它并发事务访问同一行(还要求绑定行级锁,除非您希望锁定整页,请咨询DBA以了解基于行大小的选项)。
在释放记录或结束CICS事务之前,必须将所述记录标记为“sent”,以便其他等待的并发事务不会抓取它们并再次发送它们。这可以像在表中添加一个sent Y/N列并在select where子句中添加“AND sent〈〉'Y'”一样简单。在发送记录之后,在这些记录上执行UPDATE并设置sent = 'Y'。根据行数据,您可能会使用其他内容,如发送时间或其他内容,它只需要是将从重选中排除所述行的内容。