4.2.5 トランザクションとTAMアクセスの関係

トランザクションブランチで,TAMアクセスのエラーが起こった場合は,UAPからabort()を呼び出して,そのグローバルトランザクションのプロセスを異常終了させてください。

同じグローバルトランザクション内でも,以前にアクセスした関数によっては,一つのレコードに対するアクセスがエラーリターンする場合があります。また,同じレコードへのアクセスでも,同じグローバルトランザクションに属するときと,異なるグローバルトランザクションからの場合では,結果が異なります。

同じレコードに対して関数を複数回呼び出したときの処理結果を表4-7と表4-8に示します。

表4-7 同じレコードに対して関数を複数回呼び出したときの処理結果(一つのグローバルトランザクション)

前回呼び出した関数今回呼び出した関数結果またはエラーリターンする値
トランザクション内で,まだTAMテーブルにアクセスする関数を呼び出していないdc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)
dc_tam_read(更新目的の入力)
dc_tam_read_cancel(入力の取り消し)DCTAMER_SEQENCE(01732)
dc_tam_rewrite(入力前提の更新)DCTAMER_SEQENCE(01732)
dc_tam_write(更新)
dc_tam_write(追加)
dc_tam_delete(削除)
dc_tam_read
(参照目的の入力)
dc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)
dc_tam_read(更新目的の入力)
dc_tam_read_cancel(入力の取り消し)DCTAMER_SEQENCE(01732)
dc_tam_rewrite(入力前提の更新)DCTAMER_SEQENCE(01732)
dc_tam_write(更新)
dc_tam_write(追加)DCTAMER_EXKEY(01735)
dc_tam_delete(削除)
dc_tam_read
(参照目的の入力 排他を指定)
dc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)
dc_tam_read(更新目的の入力)
dc_tam_read_cancel(入力の取り消し)1
dc_tam_rewrite(入力前提の更新)DCTAMER_SEQENCE(01732)
dc_tam_write(更新)
dc_tam_write(追加)DCTAMER_EXKEY(01735)
dc_tam_delete(削除)
dc_tam_read
(更新目的の入力)
dc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)
dc_tam_read(更新目的の入力)
dc_tam_read_cancel(入力の取り消し)
dc_tam_rewrite(入力前提の更新)
dc_tam_write(更新)
dc_tam_write(追加)DCTAMER_EXKEY(01735)
dc_tam_delete(削除)
dc_tam_read_cancel
(入力の取り消し)
dc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)
dc_tam_read(更新目的の入力)
dc_tam_read_cancel(入力の取り消し)DCTAMER_SEQENCE(01732)2
dc_tam_rewrite(入力前提の更新)DCTAMER_SEQENCE(01732)
dc_tam_write(更新)
dc_tam_write(追加)DCTAMER_EXKEY(01735)
dc_tam_delete(削除)
dc_tam_rewrite
(入力前提の更新)
dc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)
dc_tam_read(更新目的の入力)
dc_tam_read_cancel(入力の取り消し)DCTAMER_EXREWRT(01734)
dc_tam_rewrite(入力前提の更新)
dc_tam_write(更新)
dc_tam_write(追加)DCTAMER_EXKEY(01735)
dc_tam_delete(削除)
dc_tam_write
(更新,または追加)
dc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)
dc_tam_read(更新目的の入力)
dc_tam_read_cancel(入力の取り消し)DCTAMER_SEQENCE(01732)
dc_tam_rewrite(入力前提の更新)DCTAMER_SEQENCE(01732)
dc_tam_write(更新)
dc_tam_write(追加)DCTAMER_EXKEY(01735)
dc_tam_delete(削除)
dc_tam_delete
(削除)
dc_tam_read(参照目的の入力)DCTAMER_NOREC(01731)
dc_tam_read(参照目的の入力 排他を指定)DCTAMER_NOREC(01731)
dc_tam_read(更新目的の入力)DCTAMER_NOREC(01731)
dc_tam_read_cancel(入力の取り消し)DCTAMER_NOREC(01731)
dc_tam_rewrite(入力前提の更新)DCTAMER_NOREC(01731)3
dc_tam_write(更新)DCTAMER_NOREC(01731)
dc_tam_write(追加)
dc_tam_delete(削除)DCTAMER_NOREC(01731)
(凡例)
○:エラーになりません。
DCTAMER_NOREC(01731):指定されたレコードはありません。
DCTAMER_SEQENCE(01732):dc_tam_read関数を呼び出していません。
DCTAMER_EXKEY(01735):関数に設定したキー値のレコードがあるので,追加できません。
注※1
dc_tam_read関数(参照目的の入力,排他を指定)の前に,dc_tam_rewrite関数,dc_tam_write関数を呼び出して,レコードを更新または追加されている場合は,DCTAMER_EXREWRT,またはDCTAMER_EXWRITEがリターンされます。
注※2
dc_tam_read_cancel関数(入力の取り消し)の前にdc_tam_rewrite関数,dc_tam_write関数を呼び出して,レコードを更新または追加されている場合は,DCTAMER_EXWRITEがリターンされます。
注※3
dc_tam_delete関数(削除)の前にdc_tam_write関数を呼び出して,レコードが追加されている場合は,DCTAMER_SEQENCEがリターンされます。

表4-8 同じレコードに対して関数を複数回呼び出したときの処理結果(異なるグローバルトランザクション)

前回呼び出した関数今回呼び出した関数結果またはエラーリターンする値
トランザクション内で,まだTAMテーブルにアクセスする関数を呼び出していないdc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)
dc_tam_read(更新目的の入力)
dc_tam_read_cancel(入力の取り消し)1
dc_tam_rewrite(入力前提の更新)1
dc_tam_write(更新)
dc_tam_write(追加)
dc_tam_delete(削除)
dc_tam_read
(参照目的の入力)
dc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)2
dc_tam_read(更新目的の入力)2
dc_tam_read_cancel(入力の取り消し)1
dc_tam_rewrite(入力前提の更新)1
dc_tam_write(更新)2
dc_tam_write(追加)DCTAMER_EXKEY(01735)
dc_tam_delete(削除)2
dc_tam_read
(参照目的の入力 排他を指定)
dc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)2
dc_tam_read(更新目的の入力)DCTAMER_LOCK(01736)3
dc_tam_read_cancel(入力の取り消し)1
dc_tam_rewrite(入力前提の更新)1
dc_tam_write(更新)DCTAMER_LOCK(01736)3
dc_tam_write(追加)DCTAMER_LOCK(01736)3
dc_tam_delete(削除)DCTAMER_LOCK(01736)3
dc_tam_read
(更新目的の入力)
dc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)DCTAMER_LOCK(01736)3
dc_tam_read(更新目的の入力)DCTAMER_LOCK(01736)3
dc_tam_read_cancel
(入力の取り消し)
1
dc_tam_rewrite(入力前提の更新)1
dc_tam_write(更新)DCTAMER_LOCK(01736)3
dc_tam_write(追加)DCTAMER_LOCK(01736)3
dc_tam_delete(削除)DCTAMER_LOCK(01736)3
dc_tam_read_cancel
(入力の取り消し)
dc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)4,※5
dc_tam_read(更新目的の入力)4,※5
dc_tam_read_cancel
(入力の取り消し)
1
dc_tam_rewrite(入力前提の更新)1
dc_tam_write(更新)4,※5
dc_tam_write(追加)DCTAMER_LOCK(01736)3
dc_tam_delete(削除)DCTAMER_LOCK(01736)3
dc_tam_rewrite
(入力前提の更新)
dc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)DCTAMER_LOCK(01736)3
dc_tam_read(更新目的の入力)DCTAMER_LOCK(01736)3
dc_tam_read_cancel
(入力の取り消し)
1
dc_tam_rewrite(入力前提の更新)1
dc_tam_write(更新)DCTAMER_LOCK(01736)3
dc_tam_write(追加)DCTAMER_LOCK(01736)3
dc_tam_delete(削除)DCTAMER_LOCK(01736)3
dc_tam_write
(更新,または追加)
dc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)DCTAMER_LOCK(01736)3
dc_tam_read(更新目的の入力)DCTAMER_LOCK(01736)3
dc_tam_read_cancel
(入力の取り消し)
1
dc_tam_rewrite(入力前提の更新)1
dc_tam_write(更新)DCTAMER_LOCK(01736)3
dc_tam_write(追加)DCTAMER_LOCK(01736)3
dc_tam_delete(削除)DCTAMER_LOCK(01736)3
dc_tam_delete
(削除)
dc_tam_read(参照目的の入力)
dc_tam_read(参照目的の入力 排他を指定)DCTAMER_LOCK(01736)3
dc_tam_read(更新目的の入力)DCTAMER_LOCK(01736)3
dc_tam_read_cancel(入力の取り消し)1
dc_tam_rewrite(入力前提の更新)1
dc_tam_write(更新)DCTAMER_LOCK(01736)3
dc_tam_write(追加)DCTAMER_LOCK(01736)3
dc_tam_delete(削除)DCTAMER_LOCK(01736)3
(凡例)
○:エラーになりません。
-:該当しません。
DCTAMER_EXKEY(01735):関数に設定したキー値のレコードがあるので,追加できません。
DCTAMER_LOCK(01736):排他エラーが起こりました。
注※1
異なるトランザクションでは,別の処理になります。
注※2
別グローバルトランザクションで,同じTAMテーブルに対してレコードの追加/削除している場合は,DCTAMER_LOCK(01736)がリターンされます。ただし,排他待ち種別にDCTAM_WAITを設定した場合は,排他解除待ちとなります。
注※3
排他待ち種別にDCTAM_WAITを設定した場合は,排他待ちとなります。
注※4
別グローバルトランザクションでレコードの追加/削除している場合は,DCTAMER_LOCK(01736)がリターンされます。ただし,排他待ち種別にDCTAM_WAITを設定した場合は,排他解除待ちとなります。
注※5
dc_tam_read_cancel関数の前に,別グローバルトランザクションで,dc_tam_rewrite関数,dc_tam_write関数を呼び出して,レコードの更新または追加している場合は,DCTAMER_LOCK(01736)がリターンされます。ただし,排他待ち種別にDCTAM_WAITを設定した場合は,排他解除待ちとなります。