SQL Server: транзакция хранимой процедуры - программирование

SQL Server: транзакция хранимой процедуры

Здравствуйте, я получил несколько хранимых процедур для создания продуктов и других материалов на моем сайте. Теперь я должен запустить некоторые из них в транзакции. Возможно ли это или я должен сделать хранимую процедуру только для транзакции?

Могу ли я сказать что-то вроде

BEGIN TRAN
"1. stored procedure"
"2. stored procedure"
COMMIT
4b9b3361

Ответ 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