データベースのトランザクションのみ部分的にコミットします
-
22-09-2019 - |
質問
私はそれが例外なく完了していても、時々そのすべての操作をコミットするために失敗しているのSybase ASEデータベース・サーバ上で実行されているT-SQLストアドプロシージャを持っています。ここではそれが何をするかのラフな例だ。
BEGIN TRANSACTION
UPDATE TABLE1
SET FIELD1 = @NEW_VALUE1
WHERE KEY1 = @KEY_VALUE1
IF @@error <> 0 OR @@rowcount <> 1 BEGIN
ROLLBACK
RETURN 1
END
UPDATE TABLE2
SET FIELD2 = @NEW_VALUE2
WHERE KEY2 = @KEY_VALUE2
IF @@error <> 0 OR @@rowcount <> 1 BEGIN
ROLLBACK
RETURN 2
END
INSERT TABLE2 (FIELD2, FIELD3)
VALUES (@NEW_VALUE3a, @NEW_VALUE3b)
IF @@error <> 0 OR @@rowcount <> 1 BEGIN
ROLLBACK
RETURN 3
END
COMMIT TRANSACTION
RETURN 0
は手順は時間の少なくとも数百日で呼ばれています。これらの例(おそらく<3%)、のみINSERT
文コミットの小さな割合で。 PROCは完了し、0を返しますが、2 UPDATE
sはなりません。もともと、私たちはそれがWHERE
s上UPDATE
句が何も一致しなかったことかもしれないと思ったので、私たちはIF @@rowcount
ロジックを追加しました。しかし、たとえそこにあるものをチェックして、INSERT
はまだ起こっていると手続きはまだ完了し、0を返してます。
私はこの種の問題を引き起こすかもしれないものについてのアイデアを探しています。 SQLトランザクションが仕事の方法、またはSybaseは、具体的仕組みについては何も、すべてをコミットしないCOMMIT
を引き起こしている可能性がありますこと、ありますか? UPDATEを継続するために何かが、手順と一致しないする可能性があり、私のIF
ブロックについての何かはありますか?他のアイデア?
解決
であるが、彼らが更新されている可能性があるが、何かが戻って値を変更していますか?ログテーブルにこれらのテーブルの上に、そのトリガー挿入中に更新トリガを追加してみてください。ログに見て更新されていないように見えるの行について、行かない?
があります他のヒント
あなたは変数の値を設定する方法を知らない、NEW_VALUE1 @の値はFIELD1の前の値と同じであれば、アップデートが成功し、まだあなたが考えて作っ何も変わっていないように見えるだろうと私に起こりますトランザクションは起こっていませんでした。
また、アップデートに影響を及ぼしているトリガーを持つことができます。