web-dev-qa-db-ja.com

SQL ServerのBEGIN / ENDとBEGIN TRANS / COMMIT / ROLLBACK

私はこれらの発言の違いについてウェブ上で情報を見つけようとしていましたが、それらは同一であるように見えますが、その確認や、2つの間の何らかの種類の比較を見つけることができません。

これを行うことの違いは何ですか?

BEGIN
    -- Some update, insert, set statements
END

そしてこれをやって

BEGIN TRANS
    -- Some update, insert, set statements
COMMIT TRANS

例外、タイムアウト、またはその他の一般的な障害が発生した場合にのみロールバックする必要があることに注意してください。ロールバックする条件付きの理由はありません。

23
Rich

BEGINとENDはコードブロックを扱います。それらは多くの言語で見られる中括弧に似ています:

if (somethingIsTrue)
{ // like BEGIN
    // do something here
} // like END

SQLでは、これは次のとおりです。

if somethingIsTrue
BEGIN
    -- do something here
END

BEGIN TRANCOMMIT、およびROLLBACK開始および終了transactions。新しいコードブロックは指定しません。トランザクション境界をマークするだけです。

BEGIN TRANCOMMITを別々のコードブロックに入れます。たとえば、コードをトランザクションの一部にしたいが、コードがすでにトランザクション内にある場合に新しいコードを開始したくない場合は、次のようにすることができます。

declare @TranStarted bit = 0
if @@trancount = 0
begin
    set @TranStarted = 1
    begin tran
end

-- ... do work ...

if @TranStarted = 1
begin
    commit
    set @TranStarted = 0
end
29
Paul Williams

通常のBEGINとENDはトランザクションには使用されません。代わりに、C#/ C++/Javaのブレース{}のように、コードの一部のブロックが単一のユニットであることを示すためだけのものです。

IFステートメントまたは10の処理を実行するWHILEループがある場合は、それらをBEGIN/ENDで囲む必要があります。これにより、SQL Serverは、10のステートメントのリスト全体をその条件の一部として実行する必要があることを認識します。

5
Mike Mooney

これら2つのステートメントはまったく異なります。

BEGIN..ENDコードブロックをマークします(ifステートメントなど)

IF @something = 1
BEGIN
  -- Do something when @something is equal to 1
END

BEGIN TRANS..COMMIT TRANSトランザクションを囲むブロックをラップします。サーバーの設定によっては、エラーが発生した場合にトランザクションをロールバックします。

2
Jamiec

始まりがあることは言及されるべきです。 PostgreSQLでは、それによってトランザクションブロックも開始され、最初は混乱しました。

http://www.postgresql.org/docs/9.0/static/sql-begin.html

"BEGINはトランザクションブロックを開始します。つまり、BEGINコマンドの後のすべてのステートメントは、明示的なCOMMITまたはROLLBACKが指定されるまで、単一のトランザクションで実行されます。デフォルトでは(BEGINなしで)、PostgreSQLは"自動コミット "モードでトランザクションを実行します。 、各ステートメントは独自のトランザクションで実行され、コミットはステートメントの最後で暗黙的に実行されます(実行が成功した場合はロールバックが実行されます)。

2
Sithlord

私はEND TRANSを見たことがない:)

eNDキーワードはBEGINキーワードにのみ使用し、BEGINトランスには使用しないと思います。BEGINトランスにはコミットまたはロールバックを使用します。

0
Md. Parvez Alam