2016-11-13 20 views
1

TeacherテーブルにId = 111の行がありませんが、このトランザクション(最初のトランザクション)は作成されましたが、Subjectテーブルで動作し、新しい行が挿入されました。すべての変更をロールバックしてはいけませんか?エラーがあってもトランザクションはロールバックされませんか?

BEGIN TRANSACTION 
INSERT INTO Subject (Name, SupervisorId) VALUES('Statistics', 4) 
UPDATE Teacher SET Name ='Hady' WHERE Id=111 
COMMIT TRANSACTION 

私はそれにいくつかのより多くのロジックを追加し、まだ動作していない:

Begin Try 
BEGIN TRANSACTION 
INSERT INTO Subject (Name, SupervisorId) VALUES('Statistics', 4) 
UPDATE TeacherO SET Name ='Hady' WHERE Id=111 
COMMIT TRANSACTION 
End Try 
Begin Catch 
ROLLBACK TRANSACTION 
End Catch 

答えて

2

私はこれを正しく理解していれば、あなたは教師テーブル内= 111 IDで何行がない場合教師のテーブルの行を更新しようとが...

誤りであったことを、前提とし禁止されているか不可能なことをすると、エラーが発生します。キャストなしで文字列に数値を追加しようとすると。または、存在しないオブジェクトに手を加えようとする場合。多分30.02.2016を日付に変換したいと思うかもしれません。すべてがエラーになります。

id = 111のすべての行を更新するようにデータベースに指示すると、まさにこれが起こります。id = 111のすべての行が更新されます。あなたの場合、影響を受ける行の数はゼロになります。しかし、これはエラーではありません...

+0

私はそれを考えましたので、私は「TeacherO」のテーブルを「TeacherO」に変更しましたが、これは何も変わらない、またはそれはタイプではありませんエラートランザクションは動作しますか? –

+1

存在しないテーブルに対して 'UPDATE'を使用しようとすると、これはコンパイルすべきではありません... **既存の*行に*間違った値を設定しようとすると、エラーが発生しました** 。 ID = 2の教師がいると仮定しましょう。あなたは** UPDATE教師SET ID = 'テスト' WHERE Id = 2;で実際の**エラーを受け取ります。これはどんな場合でも無効になります... – Shnugo

+1

私はそれを得ました、私は最初にエラー処理について読む必要があります –

0

あなたはそれがロールバックを保証するためにXACT_ABORTセットオプションを使用する必要があります。それがなければロールバックは起こらない。

SET XACT_ABORT ON; 
BEGIN TRY 
    BEGIN TRANSACTION; 
    INSERT INTO Subject (Name, SupervisorId) VALUES('Statistics', 4); 
    UPDATE TeacherO SET Name ='Hady' WHERE Id=111; 
    COMMIT TRANSACTION; 
END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION; 
END CATCH 
関連する問題