(SQL SERVER 2008)TransactionScope(.Complete())内でトランザクションタイムアウトエラーが発生した場合、トランザクションがロールバックされると思いますか?
更新:
エラーは、実際には.Complete()ではなく、閉じ中括弧(つまり、.Dispose())でスローされています。完全なエラーは次のとおりです。
The transaction has aborted. System.Transactions.TransactionAbortedException TransactionAbortedException System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.TimeoutException: Transaction Timeout
--- End of inner exception stack trace ---
at System.Transactions.TransactionStateAborted.BeginCommit(InternalTransaction tx, Boolean asyncCommit, AsyncCallback asyncCallback, Object asyncState)
at System.Transactions.CommittableTransaction.Commit()
at System.Transactions.TransactionScope.InternalDispose()
at System.Transactions.TransactionScope.Dispose()
私が知る限り、トランザクションはロールバックされず、SPID/session_idに対してKILLを発行するまでテーブルはロックされたままでした。
DBCC OPENTRANを使用して最も古いトランザクションを取得し、それを強制終了しました。 KILL WITH STATUSを試しましたが、何もロールバックされていないため、ステータスが利用できないというメッセージが表示されます。 sys.dm_exec_sessionsのSPID/session_idのステータスは「スリープ中」です。コードスニペット:
try
{
using (var transaction = new TransactionScope())
{
LOTS OF WORK CARRIED OUT WITH LINQ ENTITIES/SubmitChanges() etc.
transaction.Complete(); //Transaction timeout
}
return result;
}
catch (Exception ex)
{
logger.ErrorException(ex.Message, ex);
result.Fail(ex.Message);
return result;
}
更新:
問題は完全には解決されていませんが、他の誰かがこの問題を抱えている場合は、さらに詳しい情報があります。
データベースの再構築と、いくつかのビジネス機能の再考が行われていると感じています...
TransactionAbortedExceptionは実際にはタイムアウトだと思います。その場合、TransactionAbortedExceptionのInnerExceptionがタイムアウトであることがわかります。
トランザクションスコープのタイムアウトがコマンドのタイムアウトよりも長いことを確認することで、それを取り除くことができるはずです。
トランザクションスコープを次のように変更してみてください。
new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(60))
また、コンテキストに明示的なタイムアウトを設定します。次のようになります。
myContext.CommandTimeout = 30; //This is seconds
「物理ファイル」machine.configを変更してこの問題を解決します。
1。ファイルをローカライズする必要があります:
2。次のコードを追加する必要があります。
<system.transactions>
<defaultSettings timeout="00:59:00" />
</system.transactions>