SQL Server: транзакция хранимой процедуры
Здравствуйте, я получил несколько хранимых процедур для создания продуктов и других материалов на моем сайте. Теперь я должен запустить некоторые из них в транзакции. Возможно ли это или я должен сделать хранимую процедуру только для транзакции?
Могу ли я сказать что-то вроде
BEGIN TRAN
"1. stored procedure"
"2. stored procedure"
COMMIT
Ответы
Ответ 1
Чтобы добавить к другим ответам выше, вы можете добавить некоторые ошибки:
BEGIN TRAN
BEGIN TRY
EXEC P1
EXEC P2
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH
Обновление с помощью кода С# (мне лично легче переносить код из sprocs и слоя данных - упрощает составление хранимых процедур на более позднем этапе):
using (var conn = new SqlConnection(...))
trans = conn.BeginTransaction();
try
{
...call P1 using transaction
...call P2 using transaction
trans.Commit();
}
catch
{
trans.RollBack();
throw;
}
}
Ответ 2
Да, хранимая процедура может быть запущена внутри транзакции. Пожалуйста, найдите ниже пример запроса.
create table temp1
(
id int,
name varchar(20)
)
create table temp2
(
id int,
name varchar(20)
)
go
create proc p1 as
insert temp1 values (1, 'test1')
create proc p2 as
insert temp2 values (1, 'test2')
go
begin tran tx
exec p1
exec p2
commit
Ответ 3
Из SQL Server (не уверен в других РСУБД) вы можете вызывать несколько хранимых процедур внутри транзакции.
BEGIN TRAN
EXEC StoredProc1
EXEC StoredProc2
COMMIT TRAN
Возможно, вы захотите добавить код возврата к сохраненному процессу, чтобы проверить, следует ли запускать сохраненный proc 2, если не удалось пропустить проком 1
EDIT:
Чтобы проверить код возврата, вы можете сделать что-то вроде следующего. Это запустит первую сохраненную процедуру. Если он возвращает 0, то он запускает второй. Если второй возвращает 0, то он совершает транзакцию. Если либо возвращается не-0, он откатит транзакцию
DECLARE @ReturnValue INT
BEGIN TRAN
EXEC @ReturnValue = StoredProc1
IF @ReturnValue = 0
BEGIN
EXEC @ReturnValue = StoredProc2
IF @ReturnValue = 0
BEGIN
COMMIT
END
ELSE
BEGIN
ROLLBACK
END
END
ELSE
BEGIN
ROLLBACK
END
Ответ 4
Begin TRAN
BEGIN TRY
-- your Action
Commit TRAN
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN
END
END CATCH