4

linqを使用してデータベースに変更をコミットするために、次の形式を使用しています。

Begin Transaction (Scope Serialized, Required)
    Check Business Rule 1...N
    MyDataContext.SubmitChanges()
    Save Changes Done In Previous Query To Log File
End Transaction Scope

しかし、SQL Serverプロファイラーでは、Connection:Startに次の行が表示されます。

set transaction isolation level read committed

私はこれ(http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/93a45026-0425-4d49-a4ac-1b882e90e6d5)を調べて、答えがあると思いました。

Microsoft Connectでこれ(https://connect.microsoft.com/VisualStudio/feedback/details/565441/transactionscope-linq-to-sql?wa=wsignin1.0)を見るまでは。

誰かが私のコードが実際にシリアル化された分離レベルで実行されているのか、それとも実際に読み取りコミットで実行されているのかを教えてもらえますか?

4

3 に答える 3

7

トランザクションの作成方法によって異なります。

インラインSQLを実行して開始した場合(BEGIN TRAN例:)、L2Sはトランザクションを認識せず、で新しいネストされたトランザクションを起動しREAD COMMITTEDます。

ただし、System.Transactionを使用した場合、またはにトランザクションが設定されているDataContext場合、SubmitChangesはそのトランザクションに参加します。

TM: Begin TranおよびTM: Commit Tranイベントクラスを選択すると、プロファイラーでこれらのトランザクションの開始と停止を確認できます。

注:ADO.Netは発行されず、バッチBEGIN TRANで発行SET TRANSACTION ISOLATIONされません。これは下位レベルで実行されます。

本当に動作を確認したい場合は、現在の分離レベルをロギングテーブルに挿入するトリガーをテーブルに作成し、それを確認します。

次のコマンドを実行して、現在の分離レベルを取得できます。

SELECT CASE transaction_isolation_level 
WHEN 0 THEN 'Unspecified' 
WHEN 1 THEN 'Read Uncommitted' 
WHEN 2 THEN 'Read Committed' 
WHEN 3 THEN 'Repeatable Read' 
WHEN 4 THEN 'Serializable' 
WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL 
FROM sys.dm_exec_sessions 
where session_id = @@SPID
于 2011-04-21T11:38:33.440 に答える
1

私の推測では、DataContextを作成してから、TransactionScopeを使用しました。参加するには、TransactionScopeで接続を開く必要があります。

于 2013-10-14T16:25:06.213 に答える
1

http://entityframework.codeplex.com/workitem/1712から

TransactionScopeは、SQLコマンドではなくリモートAPI呼び出しを使用して、SQLServerでトランザクションを実行します。これらのAPI呼び出しは、SQLプロファイラーの標準トレースには含まれていません。

[イベントの選択]ページに移動し、[すべてのイベントを表示]チェックボックスをクリックして、[トランザクション]カテゴリからすべてのイベントを選択することで、それらを含めることができます。これにより、「TM:トラン開始の開始」、「SQLTransaction」、「TM:トラン完了の開始」などのイベントが実際にいつ発生するかを確認できます。

[イベントの選択]ページでTSQLイベントのTransactionID列をチェックして、実行中の各SQLバッチがどのトランザクションに関連付けられているかを確認することもできます。

残念ながら、SQLプロファイラーで各コマンドが実行されている効果的な分離レベルを直接観察する方法がわかりません。しかし、間接的な方法があります...

接続が開かれると、トレースに「AuditLogin」イベントが表示されます。多くの場合、このイベントには分離レベルが含まれます。現在、「監査ログイン」は実際の分離レベルが設定される前に発生するため、報告される分離レベルは、開始しようとしているトランザクションの分離レベルを正確に反映していません。これを解釈するためのヒントを次に示します。接続の開始が実際に新しい接続に到達すると、常にデフォルトのトランザクション分離レベルが報告されます。たとえば、「トランザクション分離レベルの設定はコミットされていません」と表示されます(これは、トランザクションの有効な分離レベル(後で設定されます)接続が開かれ、接続プールに戻された後(つまり閉じられた後)、後続の接続の開始は、実際にはプールからの既存の接続を再利用します。この場合、「監査ログイン」は、接続が最後にプールに戻ったときに設定された分離レベルを報告します。これは、事後に使用された分離レベルを確認するのに役立ちます。たとえば、コードスニペットでは、トランザクションをロールバックするために接続が最後に開かれています(トランザクションを明示的に完了としてマークしていないため)。その「AuditLogin」イベントでは、接続が以前にクエリの実行に使用されたときに有効だった分離レベルを確認できるはずです。これは、「settransactionisolationlevelreaduncommitted」という行で表されます。前回接続がプールに戻ったときに設定された分離レベルを報告します。これは、事後に使用された分離レベルを確認するのに役立ちます。たとえば、コードスニペットでは、トランザクションをロールバックするために接続が最後に開かれています(トランザクションを明示的に完了としてマークしていないため)。その「AuditLogin」イベントでは、接続が以前にクエリの実行に使用されたときに有効だった分離レベルを確認できるはずです。これは、「settransactionisolationlevelreaduncommitted」という行で表されます。前回接続がプールに戻ったときに設定された分離レベルを報告します。これは、事後に使用された分離レベルを確認するのに役立ちます。たとえば、コードスニペットでは、トランザクションをロールバックするために接続が最後に開かれています(トランザクションを明示的に完了としてマークしていないため)。その「AuditLogin」イベントでは、接続が以前にクエリの実行に使用されたときに有効だった分離レベルを確認できるはずです。これは、「settransactionisolationlevelreaduncommitted」という行で表されます。トランザクションをロールバックするために接続が最後に開かれています(トランザクションを明示的に完了としてマークしていないため)。その「AuditLogin」イベントでは、接続が以前にクエリの実行に使用されたときに有効だった分離レベルを確認できるはずです。これは、「settransactionisolationlevelreaduncommitted」という行で表されます。トランザクションをロールバックするために接続が最後に開かれています(トランザクションを明示的に完了としてマークしていないため)。その「AuditLogin」イベントでは、接続が以前にクエリの実行に使用されたときに有効だった分離レベルを確認できるはずです。これは、「settransactionisolationlevelreaduncommitted」という行で表されます。

于 2015-06-17T04:42:43.387 に答える