프로 시저 sp_Insert
을 2 개의 옵션과 함께 저장했습니다. INSERT INTO Table1
및 INSERT INTO Table2
.저장 프로 시저에서 트랜잭션이 롤백되지 않음
는 I 3 개 변수를 선언 한 @choice
입력으로서 @insertDataToTable1
및 @insertDataToTable2
(1
, 2
또는 3
될 수 있음).
그래서 코드 구조가 보이는 같은 :
CREATE PROC sp_MyProc
@choice...
@insertDataToTable1...
@insertDataToTable2...
AS
BEGIN TRAN
IF(@choice = 1 OR @choice = 3)
BEGIN
BEGIN TRY
//my query to insert to Table 1
END TRY
BEGIN CATCH
// print error
ROLLBACK //should rollback transaction
RETURN
END CATCH
END
ELSE IF (@choice = 2 OR @choice = 3)
BEGIN
BEGIN TRY
//my query to insert to Table 1
END TRY
BEGIN CATCH
// print error
ROLLBACK //should rollback transaction
RETURN
END CATCH
END
COMMIT
그래서
@choice = 1
이상의 경우 것은 (표 1에 instert)에만 첫 번째 쿼리를 실행 @choice = 2
실행 만 2 쿼리의 경우 (2 테이블 inster), 경우 @choice = 3
실행 1 두와 두 번째 쿼리는 첫 번째 및 두 번째 테이블에 databa를 삽입합니다.
는 문제 :
모든 거래와 문제를 제외하고, 잘 될 것입니다. 블록 중 하나가 실패 할 경우 트랜잭션은을 롤백하지 않습니다. 제 1 쿼리가 succssful (테이블 1에 데이터 삽입)이고 두 번째 쿼리가 실패한 경우 (예 : 기본 키 문제) 롤백되지 않는 경우 value1이 table1에 삽입 된 상태로 유지됩니다. 문제가 어디에 있습니까?
사이드 참고 : "는 ** SP _ ** 접두사 때의 사용을 피하십시오 : (https://msdn.microsoft.com/en-gb/library/ms187926.aspx) ['PROCEDURE'을 CREATE] 이 접두사는 SQL Server에서 시스템 프로 시저를 지정하는 데 사용됩니다. " –