2012-05-07 15 views
2

私はSQL Server 2005でこれをやっています。 テーブルがあり、int型の列が1つしかありません。それにcharを挿入することはできません。「ロールバック」と言うことなくロールバックできますか?

これを実行すると、テーブルに1行挿入されます。

これを実行すると、テーブルにゼロ行が挿入されます。したがって、トランザクションは2つのタスクを1つの実行単位にグループ化します。 1つのタスクが失敗すると、トランザクション全体が失敗します。

BEGIN TRANSACTION 
INSERT INTO TestTable VALUES(3) 
INSERT INTO TestTable VALUES('b') 
COMMIT TRANSACTION 

私の質問は:私は上記のコードでROLLBACKを持っていないが、それはまだロールバックされ....誰もが、私はこれを理解するのに役立つ可能性があるため、ROLLBACKのトランザクションは無用であるように見えますか?

+4

ステートメントの* none *が失敗したにもかかわらず、変更を取り消したい場合、 'ROLLBACK'は非常に便利です。 :) –

+0

はすべてあなたのコードですか? (またはすべての*関連する*コード) – MilkyWayJoe

+0

@ MilkyWayJoe:はい、これは私のコードです。ちょうど学習のため。 –

答えて

0

SQL Serverでは、すべてのコードが既定で暗黙的なトランザクションで実行されます。両方のステートメントを1つのバッチで送信していて、クエリ・オプションXACT_ABORTをオンにしている場合は、すべての障害がトランザクション全体をロールバックする必要があります。デフォルトの動作では、エラーの原因となったステートメントのみをロールバックします。独自のバッチでステートメントを提出する場合(SSMSで個別に強調表示し、F5キーを押すか、または「go」ステートメントを間に入れることによって)、別の動作が表示されます。

関連する問題