В моем .NET-коде внутри транзакции базы данных (с использованием TransactionScope
) я мог бы включить вложенный блок с TransactionScopeOption.Suppress
, который гарантирует, что команды внутри вложенного блока будут совершены, даже если внешний блок откидывается назад. Ниже приведен пример кода:Эквивалент T-SQL .NET TransactionScopeOption.Suppress
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();
}
Я пытался найти, если это может быть сделано в T-SQL. Несколько человек рекомендовали OPENROWSET, но он не выглядит очень «элегантным» для использования. Кроме того, я думаю, что это плохая идея поместить информацию о соединении в код T-SQL.
Я использовал SQL Service Broker в прошлом, но также поддерживает Transactional Messaging, что означает, что сообщение не отправляется в очередь до транзакции базы данных.
Мое требование: Хранимые процедуры нашего приложения запускаются каким-либо сторонним приложением в рамках неявной транзакции, инициированной за пределами хранимой процедуры. И я хочу, чтобы улавливать и регистрировать любые ошибки (в таблице базы данных в одной базе данных) в моих хранимых процедурах. Мне нужно повторно выбросить исключение, чтобы позволить стороннему приложению отменить транзакцию и чтобы он знал, что операция потерпела неудачу (и, следовательно, делает все, что требуется в случае сбоя).
Так что ваш код .NET вызывается сторонним кодом .NET? – usr
Вы просматривали переменные таблицы? – Shaneis
@usr - я не знаю код стороннего приложения. Код .NET, который я опубликовал в моем вопросе, был только тем, что я хотел бы сделать то же самое в коде T-SQL. –