質問

私はそれが例外なく完了していても、時々そのすべての操作をコミットするために失敗しているの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 UPDATEsはなりません。もともと、私たちはそれがWHEREs上UPDATE句が何も一致しなかったことかもしれないと思ったので、私たちはIF @@rowcountロジックを追加しました。しかし、たとえそこにあるものをチェックして、INSERTはまだ起こっていると手続きはまだ完了し、0を返してます。

私はこの種の問題を引き起こすかもしれないものについてのアイデアを探しています。 SQLトランザクションが仕事の方法、またはSybaseは、具体的仕組みについては何も、すべてをコミットしないCOMMITを引き起こしている可能性がありますこと、ありますか? UPDATEを継続するために何かが、手順と一致しないする可能性があり、私のIFブロックについての何かはありますか?他のアイデア?

役に立ちましたか?

解決

であるが、彼らが更新されている可能性があるが、何かが戻って値を変更していますか?ログテーブルにこれらのテーブルの上に、そのトリガー挿入中に更新トリガを追加してみてください。ログに見て更新されていないように見えるの行について、行かない?

があります

他のヒント

あなたは変数の値を設定する方法を知らない、NEW_VALUE1 @の値はFIELD1の前の値と同じであれば、アップデートが成功し、まだあなたが考えて作っ何も変わっていないように見えるだろうと私に起こりますトランザクションは起こっていませんでした。

また、アップデートに影響を及ぼしているトリガーを持つことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top