.NET Framework クラスと ASP.NET ページは、現在のトランザクションのコミットとアボートを指定できます。コードに明示的な指定がない場合、既定の処理はコミットです。ただし、コミットでは、トランザクションごとにリソースを解放するときの処理時間が長くなるため、アプリケーションのパフォーマンスが低下することがあります。
明示的にアボートを指定すると、重大なエラーが発生したときに、クラスやページがトランザクションのアボートを実行できるようになります。トランザクションの早期に致命的なエラーをキャッチし、トランザクションを終了し、リソースを解放すると、アプリケーションのパフォーマンスが向上します。
AutoComplete の使用
System.EnterpriseServices.AutoCompleteAttribute を使用すると、トランザクションに参加しているオブジェクトは、メソッドが正常に終了する場合はトランザクションを完了させようとするようになります。メソッドで例外がスローされる場合は、トランザクションがアボートされます。この属性は、ServicedComponent クラスから派生しているクラスだけに適用できます。
この機能を使用するには、クラス メソッドの前に属性を記述します。インターフェィス メソッドに対して属性を指定しても、共通言語ランタイムによって無視されます。次のコードは、トランザクション対応のクラスでの属性の指定方法を示しています。
<Transaction(TransactionOption.Supported)> Public Class Account
Inherits ServicedComponent
<AutoComplete()> Public Sub Debit(amount As Integer)
' Do some database work. Any exception thrown here aborts the
' transaction; otherwise, transaction commits.
End Sub
End Class
[C#]
[Transaction(TransactionOption.Supported)]
public class Account : ServicedComponent {
[AutoComplete]
public void Debit(int amount) {
// Do some database work. Any exception thrown here aborts the transaction;
// otherwise, transaction commits.
}
}
SetAbort と SetComplete の使用
System.EnterpriseServices.ContextUtil クラスを使用すると、SetComplete メソッドまたは SetAbort メソッドを公開することによって、トランザクションを明示的にコミットまたはアボートできます。SetComplete は、オブジェクトに対して、処理をコミットするように指定します。SetAbort は、オブジェクトに問題が発生したので、実行中のトランザクションをアボートするように指定します。トランザクションは、そのルート オブジェクトが非アクティブになるまで、コミットもアボートもされません。また、トランザクションに参加しているオブジェクトから 1 つでもアボートの指定があると、トランザクション全体が失敗します。
SetAbort メソッドと SetComplete メソッドを使用するコードを次に示します。
'Try to do something crucial to the transaction in progress.
If Not DoSomeWork() Then
'Something goes wrong.
ContextUtil.SetAbort()
Else
'All goes well.
ContextUtil.SetComplete()
End If
[C#]
//Try to do something crucial to the transaction in progress.
if( !DoSomeWork() )
{
//Something goes wrong.
ContextUtil.SetAbort();
}
else
{
//All goes well.
ContextUtil.SetComplete();
}