Я использую TransactionScope в своем коде C#. Я постараюсь как можно больше упростить.TransactionScope и транзакции, включенные в вложенные хранимые процедуры
public void ProcessStrings(...)
{
...
using (TransactionScope transactionScope = new TransactionScope())
{
...
if(someCondition)
{
try
{
DeleteSomeStrings(...);
}
catch(Exception ex)
{
//log error
...
throw;
}
}
...
try
{
UpdateSomeStrings(...);
}
catch(Exception ex)
{
//log error
...
throw;
}
...
transactionScope.Complete();
}
...
}
В DeleteSomeStrings и UpdateSomeStrings методы вызывают два хранимых процедур через ADO.NET. Мне нужно использовать явную обработку транзакции в этих хранимых процедур, а также потому, что они также вызываются из других контекстов:
CREATE PROCEDURE [dbo].[DeleteSomeStrings]
...
--parameter list
...
AS
BEGIN TRY
BEGIN TRAN
...
COMMIT TRAN
END TRY
BEGIN CATCH
...
ROLLBACK
...
RAISERROR(...)
END CATCH
и второй из них имеет сходную структуру:
CREATE PROCEDURE [dbo].[UpdateSomeStrings]
...
--parameter list
...
AS
BEGIN TRY
BEGIN TRAN
...
COMMIT TRAN
END TRY
BEGIN CATCH
...
ROLLBACK
...
RAISERROR(...)
END CATCH
Проблема заключается в том, когда DeleteSomeStrings преуспевает, а UpdateSomeStrings завершается с ошибкой, данные, обработанные в DeleteSomeStrings, все еще фиксируются. Похоже, что TransactionScope игнорируется в этом сценарии. Я бы ожидал, что все будет отменено. Это нормальное поведение, и если да, то почему?
Когда вы выполняете первую хранимую процедуру, попробуйте использовать 'rowsAffected = cmd.ExecuteNonQuery();' if rowsAffexted is Zero, никакая точка в выполнении второго SP – user2526236
не просматривает это сообщение: http: // stackoverflow. ком/вопросы/15431285/вызов несколько SQL-сервер сохраненного-процедура-в-операции – fabricio