在CICS中对于需要序列化访问的资源, 比如流水号分配等, 都可以使用ENQ, DEQ来保证顺序化访问, 对于ENQ, DEQ之间的代码, 只有一个TASK能够占有, 当这个TASK通过ENQ 资源, 其他TASK ENQ时都会返回ENQBUSY, 一直等待直到HOLD资源的TASK DEQ资源(除非程序handle ENQBUSY或者指定NOSUSPEND). ENQ, DEQ..
.
在CICS中对于需要序列化访问的资源, 比如流水号分配等, 都可以使用ENQ, DEQ来保证顺序化访问, 对于ENQ, DEQ之间的代码, 只有一个TASK能够占有, 当这个TASK通过ENQ 资源, 其他TASK ENQ时都会返回ENQBUSY, 一直等待直到HOLD资源的TASK DEQ资源(除非程序handle ENQBUSY或者指定NOSUSPEND).
ENQ, DEQ是enqueue, dequeue的缩写. 语法如下:
________________________________________________________________________ | |
| |
| >>__ENQ__RESOURCE(data-area)__ ____________________ _________________> |
| |_LENGTH(data-value)_| |
| |
| _UOW_______________ |
| >__|___________________|___ ___________ ___>< |
| |_MAXLIFETIME(cvda)_| |_NOSUSPEND_| |
| |_TASK______________| |
| Conditions: ENQBUSY, INVREQ, LENGERR |
| |
|________________________________________________________________________|________________________________________________________________________
| |
| |
| >>__DEQ__RESOURCE(data-area)__ ____________________ _________________> |
| |_LENGTH(data-value)_| |
| |
| _UOW_______________ |
| >__|___________________|__>< |
| |_MAXLIFETIME(cvda)_| |
| |_TASK______________| |
| Conditions: INVREQ, LENGERR |
| |
| This command is threadsafe. |
| |
|________________________________________________________________________|ENQ,DEQ的使用方法,
对于资源, 我们可以区分成两种, 使用ENQ,DEQ的语法也不同:
1,说明数据区的地址代表资源, 资源是在内存中的地址, 而不是内容, 比如CWA中的变量.
2,说明数据区的内容代表资源, 资源是他的内容, 而不是地址. 比如在WORKING-STORAGE的变量. 这种的使用,必须指定LENGTH option, 告诉CICS需要ENQ,DEQ是数据变量的内容.
eg, 比如你define jnl-seq在CWA中,则流水号分配的伪代码如下:
EXEC CICS ENQ RESOURCE(JNL-SEQ) END-EXEC
ADD 1 TO JNL-SEQ
EXEC CICS DEQ RESOURCE(JNL-SEQ) END-EXEC
如果你只是deinfe jnl-seq在working-storage, 则流水号分配的伪代码如下:
EXEC CICS ENQ RESOURCE(JNL-SEQ) LENGTH(LENGTH OF JNL-SEQ) END-EXEC
ADD 1 TO JNL-SEQ
EXEC CICS DEQ RESOURCE(JNL-SEQ) LENGTH(LENGTH OF JNL-SEQ) END-EXEC.