web-dev-qa-db-ja.com

暗黙的トランザクションと明示的トランザクションの違い

SQL Server 2008の暗黙的トランザクションと明示的トランザクションの違いは何ですか?

TransactionScopeバックグラウンドで何が起こりますか? TransactionScopeを使用していますが、SQLサーバープロファイラーで "Begin transaction ..."ステートメントが表示されません。

それはどのように機能しますか?

18
Arian

基本的に、c#でTransactionScopeをImplicitに設定すると、SQL ServerのSETコマンドが呼び出され、接続がIMPLICIT_TRANSACTIONSモードになります。 (2番目のリンクにリストされているコマンドの1つを使用して)実行すると、開いたままのトランザクションが開始されますntilコミットが発行されます。接続の最後にコミットが発行されない場合、暗黙のROLLBACKが実行されます。

これは、すべてのステートメントをトランザクションに入れるOFF設定とは異なります-違いは、OFFモード(したがって、トランザクションは明示的です)では、各トランザクション(単一のステートメント)がであるということですコミットされました。

12
RichardTheKiwi

明示的トランザクションモードでは、トランザクションを明示的に開始する必要があります。暗黙的なトランザクションモードでは、トランザクションは各コミット後に自動的に開始されます。したがって、コミットする必要があるだけです。

トランザクションは「暗黙的に」開始されているため、ログに明示的な「BEGIN」は表示されません。 :)

デフォルトでは、データベースは明示的なトランザクションモードで動作し、トランザクションの自動コミットが有効になっています。つまり、BEGIN TRANSACTIONを使用して明示的なトランザクションが開始されない限り、すべてのデータ変更は、ステートメントの後にコミットされる個別のトランザクションで開始されます。これにより、データベースは失敗したときにステートメント全体をロールバックできます(たとえば、一括挿入、またはトリガー内の他のデータを変更する挿入)。

5
GolezTrol

Implicit Transactionは自動コミットです。トランザクションの開始または終了はありません。

Explicit Transactionには、Begin Transaction、Commit Transaction、Rollback Transactionコマンドによるトランザクションの開始、終了、ロールバックがあります。

明示的トランザクションでは、間にエラーが発生した場合、暗黙的トランザクションでは実行できないトランザクションの最初にロールバックできます。

2
Jom George

SqlTransaction-TransactionScopeは内部で使用します-SQL Server 2000以前のT-SQL BEGIN TRANSACTIONコマンドのみを送信します。

SQL Server 2005以降では、TDSプロトコルが拡張され、クライアントがBEGIN TRANSACTIONなどを送信せずにトランザクションを直接操作できるようになりました。プロファイラーでこれらを表示するには、「TM:トランザクションの開始」イベントなどを選択します。これらのイベントを確認するには、[すべてのイベントを表示する]チェックボックスをオンにする必要があります。これらは[トランザクション]カテゴリにあります。

TDSプロトコルドキュメントの Transaction Manager Request 、プロファイラードキュメントの TM:Begin Tran Starting Event Class 、およびの SqlInternalTransaction.ExecuteTransactionYukon を参照してください。 NET参照ソース。

0
Mike Dimmick