When multiple jobs or users access the same data, you must prevent conflicts. Choose an approach based on file type (VSAM/DB), environment (batch/CICS), and contention risk. This covers locking strategies, isolation levels, and conflict resolution.
12345678910*> Pseudocode: lock then read-update-write IF NOT LOCK-OBTAINED PERFORM RETRY-BACKOFF ELSE READ CUSTOMER-FILE COMPUTE NEW-BALANCE = CURRENT-BALANCE + TRANSACTION-AMOUNT MOVE NEW-BALANCE TO CURRENT-BALANCE REWRITE CUSTOMER-RECORD RELEASE-LOCK END-IF.
Host environments provide the primitives (e.g., VSAM shareoptions, RLS, DB locks). Your program must handle retries and backoff. Always release locks promptly to avoid deadlocks.
1234567*> Compare last-updated-timestamp or version before rewrite IF INCOMING-VERSION NOT = STORED-VERSION DISPLAY 'Conflict: data changed by another process' PERFORM RESOLVE-STRATEGY *> reload, merge, or abort ELSE REWRITE RECORD END-IF.
Use version numbers or timestamps to detect conflicts. When conflicts occur, choose resolution strategy: reload fresh data, merge changes, or abort the transaction.
1234567891011121314151617*> Optimistic: assume no conflict, check at commit READ CUSTOMER-FILE COMPUTE NEW-BALANCE = CURRENT-BALANCE + AMOUNT MOVE NEW-BALANCE TO CURRENT-BALANCE REWRITE CUSTOMER-RECORD IF FILE-STATUS = '22' *> record locked DISPLAY 'Conflict detected, retrying...' PERFORM RETRY-LOGIC END-IF. *> Pessimistic: lock before reading PERFORM OBTAIN-LOCK READ CUSTOMER-FILE COMPUTE NEW-BALANCE = CURRENT-BALANCE + AMOUNT MOVE NEW-BALANCE TO CURRENT-BALANCE REWRITE CUSTOMER-RECORD PERFORM RELEASE-LOCK.
Optimistic assumes low contention and checks for conflicts at commit time. Pessimistic locks up-front but can cause more blocking. Choose based on your contention patterns.
12345678*> Always lock in same order to prevent deadlocks IF CUSTOMER-ID < ACCOUNT-ID PERFORM LOCK-CUSTOMER-FIRST PERFORM LOCK-ACCOUNT-SECOND ELSE PERFORM LOCK-ACCOUNT-FIRST PERFORM LOCK-CUSTOMER-SECOND END-IF.
Establish consistent locking order across all programs. Use timeouts to detect and break deadlocks. Log deadlock occurrences for tuning.