2012-08-20 8 views
17

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

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

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

ответ

37

чтобы добавить другие ответы выше, вы можете добавить обработку ошибок:

BEGIN TRAN 

BEGIN TRY 

    EXEC P1 

    EXEC P2 

    COMMIT TRAN 

END TRY 
BEGIN CATCH 

    ROLLBACK TRAN 

END CATCH 

Обновление с C# код (I р ersonally найти намного легче держать транс код из sprocs и на уровне данных - делает составление хранимых процедур легче на более позднем этапе):

using (var conn = new SqlConnection(...)) 

    trans = conn.BeginTransaction(); 

    try 
    { 
     ...call P1 using transaction 
     ...call P2 using transaction 

     trans.Commit(); 
    } 
    catch 
    { 
     trans.RollBack(); 
     throw; 
    } 
} 
+0

попробуйте поймать, что Грегс отвечает просто более простым способом. ? он проверяет каждое возвращаемое значение и останавливается. если один dident возвращает 0. thaks для ответа !. – saadan

+0

теперь я получил его, чтобы работать с уловкой try, но если я сделаю это неудачно, я могу отправить строки, полученные номером, или что-то в этом роде, чтобы увидеть, когда он терпит неудачу. – saadan

+0

Вы можете отправить все, что вам нужно, из улова - немного отличающегося от ответа Грегса - скажите, что вам нужно добавить третью проку, если бы ... ответ остался бы довольно сложным. также, если это не удастся, никакие строки не будут затронуты - вы откатываете его обратно ...? – Paddy

2

Из SQL Server (не уверен, о других СУБД), Вы можете вызвать несколько хранимых процедур внутри транзакции.

BEGIN TRAN 
EXEC StoredProc1 
EXEC StoredProc2 
COMMIT TRAN 

Вы можете добавить код возврата к хранимой процедуре, чтобы проверить, следует ли запустить ХП 2, если ХП-не удался

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 
+0

Если бы добавить, если ХП 2 не работает, то это будет способный откатить хранимую процедуру 1 – Greg

+0

, поэтому, если я получил код возврата на storedproc1, как я могу проверить значение. извините im не хорошо на sql. но спасибо за помощь – saadan

+0

@saadan, я обновил свой ответ с помощью дополнительного примера – Greg

3

Да, вы можете запускать хранимые проки в транзакции, Это так просто, как вы можете попробовать запустить запрос, прежде чем разместить его здесь

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 
Смежные вопросы