私はこれらの発言の違いについてウェブ上で情報を見つけようとしていましたが、それらは同一であるように見えますが、その確認や、2つの間の何らかの種類の比較を見つけることができません。
これを行うことの違いは何ですか?
BEGIN
-- Some update, insert, set statements
END
そしてこれをやって
BEGIN TRANS
-- Some update, insert, set statements
COMMIT TRANS
?
例外、タイムアウト、またはその他の一般的な障害が発生した場合にのみロールバックする必要があることに注意してください。ロールバックする条件付きの理由はありません。
BEGINとENDはコードブロックを扱います。それらは多くの言語で見られる中括弧に似ています:
if (somethingIsTrue)
{ // like BEGIN
// do something here
} // like END
SQLでは、これは次のとおりです。
if somethingIsTrue
BEGIN
-- do something here
END
BEGIN TRAN
、COMMIT
、およびROLLBACK
開始および終了transactions。新しいコードブロックは指定しません。トランザクション境界をマークするだけです。
BEGIN TRAN
とCOMMIT
を別々のコードブロックに入れます。たとえば、コードをトランザクションの一部にしたいが、コードがすでにトランザクション内にある場合に新しいコードを開始したくない場合は、次のようにすることができます。
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
通常のBEGINとENDはトランザクションには使用されません。代わりに、C#/ C++/Javaのブレース{}のように、コードの一部のブロックが単一のユニットであることを示すためだけのものです。
IFステートメントまたは10の処理を実行するWHILEループがある場合は、それらをBEGIN/ENDで囲む必要があります。これにより、SQL Serverは、10のステートメントのリスト全体をその条件の一部として実行する必要があることを認識します。
これら2つのステートメントはまったく異なります。
BEGIN..END
コードブロックをマークします(ifステートメントなど)
IF @something = 1
BEGIN
-- Do something when @something is equal to 1
END
BEGIN TRANS..COMMIT TRANS
トランザクションを囲むブロックをラップします。サーバーの設定によっては、エラーが発生した場合にトランザクションをロールバックします。
始まりがあることは言及されるべきです。 PostgreSQLでは、それによってトランザクションブロックも開始され、最初は混乱しました。
http://www.postgresql.org/docs/9.0/static/sql-begin.html
"BEGINはトランザクションブロックを開始します。つまり、BEGINコマンドの後のすべてのステートメントは、明示的なCOMMITまたはROLLBACKが指定されるまで、単一のトランザクションで実行されます。デフォルトでは(BEGINなしで)、PostgreSQLは"自動コミット "モードでトランザクションを実行します。 、各ステートメントは独自のトランザクションで実行され、コミットはステートメントの最後で暗黙的に実行されます(実行が成功した場合はロールバックが実行されます)。
私はEND TRANSを見たことがない:)
eNDキーワードはBEGINキーワードにのみ使用し、BEGINトランスには使用しないと思います。BEGINトランスにはコミットまたはロールバックを使用します。