CICS - 多个用户的更新

时间:2013-11-24 22:54:31

标签: cics

如果大约有50个用户试图更新DB2表中的相同字段,那么CICS将如何处理? 如何在COBOL DB2程序中处理它?<​​/ p>

2 个答案:

答案 0 :(得分:3)

当CICS伪对话程序与DB / 2交互时,必须注意管理数据完整性 更新数据库, 特别是当多个CICS事务可能正在尝试读取/更新相同的事务时 DB / 2表几乎同时排。

以下是对伪对话的通用设计模式的非常简化的解释 CICS事务(这是CICS最常见的交互式编程模式)。这个问题的答案: what-are-the-advantages-of-pseudo-conversational-vs-conversational-cics-programm提供 简要介绍伪对话cics的工作原理,您可能需要在继续...

之前查看

伪对话CICS事务旨在获取当前运行 来自COMMAREA的状态(在事务之间持续的一块内存)。保存的状态 程序使用COMMAREA来确定接下来需要做什么。它然后做它,确定下一个状态 应该是,保存新状态及其可能的任何数据 需要记住&#34; 进入CICS COMMAREA然后它退出 - 释放所有资源,包括它持有的任何DB / 2锁

DB / 2锁是保持数据库完整性的关键,面对多个选择/更新/插入/删除事务竞争 相同的数据库行。伪对话CICS的问题是这些锁在事务处理之间丢失 表中的数据以及更新表所需的时间。

典型的伪对话CICS事务可能经历的状态如下:

  • 初始 - 开始新的交易,要求用户输入关键数据(将下一个状态设置为显示
  • 显示 - 验证在初始状态下输入的密钥。从DB / 2中检索相关数据并显示它(将下一个状态设置为提交
  • 提交 - 从显示状态验证更改的数据并更新DB / 2(将下一个状态设置为初始

请注意,在显示期间会检索数据。 DB / 2在此处执行读锁定 时间来防止在读取行时更新行的其他事务。取决于DB / 2和您的方式 配置了DML,此锁定只能在显示阶段的持续时间内激活,或者仅在行显示时激活 检索。在任一情况下, 一旦程序退出,锁就会丢失。当程序再次重新启动时,它将处于提交状态 执行适当的DB / 2更新/插入DML以实现对数据库的请求更改。

由于在 之间没有持久的DB / 2锁,因此这些状态转换不会阻止另一个 在第一个事务显示的时间到其更新之间访问或更改数据的事务。 这可能导致严重的数据完整性问题。请注意,当事务处于活动状态时,它可能会保留DB / 2锁 有效地阻止其他事务读取未提交的更新或表单更新它的行 是&#34;看着&#34; - 但它无法在&#34;对话&#34;的调用之间保存这些

程序员用于在伪对话CICS过程中维护数据完整性的常用机制 交易是要拥有所有交易 依赖单个公共可更新资源来充当更新冲突检测器。例如,如果您的数据库 管理与客户相关的数据,可能有一个共同的唯一密钥用于识别任何给定的客户。这些 唯一键通常只是一个数字或短字符串(例如,Customer-Id)。 客户数据库的所有表中的所有行可能使用相同的公共唯一键来标识特定客户(毕竟 这就是关键所在。)

创建一个包含两列的TRANSACTION表,一列为Customer-Id,另一列为 一些事务唯一标识符,这通常只是在事务开始时生成的时间戳(也可能是 任务ID,它只需要对事务唯一)。将此事务标识符称为TRANS-KEY。 当事务的显示阶段进入事务时 首次拥有Customer-Id。然后,它使用TRANS-KEY更新此Customer-Id的TRANSACTION表。两者都得救了 到COMMAREA。请注意,此处的更新仅基于Customer-Id完成,它将用自己的TRANS-KEY替换当前的TRANS-KEY 独特的价值。输入显示阶段,用户输入更改并输入提交阶段。此时此刻 事务尝试根据其保存的Customer-id和TRANS-KEY更新TRANSACTION表。如果更新未通过该事务 &#34;知道&#34;其他 事务已经开始在同一个客户上工作(另一个事务更改了相同Customer-id的TRANS-KEY所以 当前事务要么超时还是行未找到错误。 要保持数据库完整性,必须撤消当前事务。它会显示一些 向用户发出一条消息,通知他们已请求并发更新,并且必须放弃请求的更新 更新。如果, 另一方面,对于给定的Customer-id,TRANS-KEY没有改变,数据库锁定将被阻止任何 为同一Customer-Id更改该行的其他事务。然后,当前事务可以更新数据库,因为它知道没有其他事务在它首次开始运行的时间和它提交更新的时间之间查看或更新数据。

使所有这些工作的关键是更新Customer数据库的所有事务使用相同的TRANSACTION表来检测并发更新尝试。

这里描述的资源锁定机制通常被称为&#34;碰撞检测&#34;并且只是保持数据库完整性的许多可能方法之一 伪对话CICS事务的过程。关键是DB / 2锁被多次丢弃 在交易过程中,它需要一些&#34;合作&#34; DB / 2锁管理器,CICS Syncpoint管理器之间 和应用程序本身在使用伪对话CICS时保持数据库完整性。

最后,实际更新数据库的事务将是最后一个检索数据的事务 - 所以这个故事的寓意是迟到并提前完成!

上面的讨论不是特定于COBOL的,所有编程语言都是如此,包括COBOL,用于使用DB / 2和伪对话CICS开发应用程序。

答案 1 :(得分:1)

从IBM手册How CICS connects to DB2

  

CICS提供了CICS®DB2®附件工具。 CICS DB2附件工具在CICS环境中运行时为CICS应用程序提供对DB2数据的访问。因此,CICS应用程序可以访问DB2数据和CICS数据。如果发生事务或系统故障,CICS将协调DB2和CICS数据的恢复。

     

CICS DB2附件工具在CICS和DB2之间创建整体连接。 CICS应用程序使用此连接向DB2发出命令和请求。可以随时创建或终止CICS和DB2之间的连接,并且可以独立地启动和停止CICS和DB2。您可以为CICS连接的单个DB2子系统命名,或者(如果您具有DB2 V7或更高版本)可以使用组附加工具让DB2选择DB2子系统的数据共享组的任何活动成员进行连接。您还可以选择CICS自动连接并重新连接到DB2。 DB2系统可以由多个CICS系统共享,但每个CICS系统一次只能连接到一个DB2子系统。

用简单的英语,将CICS视为具有到DB2的多个连接池。

定义DB2表时,它使用页锁或行锁定进行定义。 (可以使用表锁定来定义,但这种情况很少见)。 DB2数据库引擎不允许多个用户一次更新页面或行,具体取决于锁定级别。

还有读锁来保持表的读一致性。 DB2调用这些读锁isolation levels