2

私は SQL Server 2005 でこれを行っています。テーブルがあります。int 型の列は 1 つだけです。o char を挿入することはできません。

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

INSERT INTO TestTable VALUES(3)   --success 
INSERT INTO TestTable VALUES('b') --fail, cannot insert char

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

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

私の質問は次のとおりです。上記のコードに ROLLBACK がないため、 ROLLBACK TRANSACTION は役に立たないように見えますが、それでもロールバックされます....誰かがこれを理解するのを手伝ってくれますか?

4

1 に答える 1

0

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

于 2012-05-08T01:45:24.483 に答える