私の.NETコードでは、データベーストランザクション内で(TransactionScope
を使用)、ネストされたブロックをTransactionScopeOption.Suppress
に含めると、ネストされたブロック内のコマンドが外側のブロックがロールバックします。私は、これはT-SQLで行うことができれば、検索しようとした.NET TransactionScopeOption.Suppressに相当するT-SQL
using (TransactionScope txnScope = new TransactionScope(TransactionScopeOption.Required))
{
db.ExecuteNonQuery(CommandType.Text, "Insert Into Business(Value) Values('Some Value')");
using (TransactionScope txnLogging = new TransactionScope(TransactionScopeOption.Suppress))
{
db.ExecuteNonQuery(CommandType.Text, "Insert Into Logging(LogMsg) Values('Log Message')");
txnLogging.Complete();
}
// Something goes wrong here. Logging is still committed
txnScope.Complete();
}
:後 は、コードサンプルです。いくつかの人々がOPENROWSETを推奨しましたが、使用するにはあまり「エレガント」に見えません。また、T-SQLコードに接続情報を入れるのは悪い考えです。
これまでSQL Service Brokerを使用していましたが、Transactional Messagingもサポートしています。これは、データベーストランザクションがコミットされるまでメッセージがキューにポストされないことを意味します。
私の要件:アプリケーションストアドプロシージャは、ストアドプロシージャの外部で開始された暗黙のトランザクション内で、一部のサードパーティアプリケーションによって起動されています。そして私は、私のストアドプロシージャ内のエラー(同じデータベース内のデータベーステーブル内の)を捕捉して記録できるようにしたい。私は例外を再スローして、サードパーティのアプリケーションにトランザクションをロールバックさせ、操作が失敗したことを知ることができるようにする必要があります。
.NETコードはサードパーティの.NETコードで呼び出されていますか? – usr
可変テーブルを見ましたか? – Shaneis
@usr - 私は第三者のアプリケーションコードを知らない。私の質問に投稿した.NETコードは、T-SQLコードで同じことをしたいと思っていただけです。 –