현재 트랜잭션 액세스
적용 대상:SQL Server
SQL Server에서 실행되는 CLR(공용 언어 런타임) 코드가 입력되는 시점에 트랜잭션이 활성화된 경우 트랜잭션은 System.Transactions.Transaction
클래스를 통해 노출됩니다.
Transaction.Current
속성은 현재 트랜잭션에 액세스하는 데 사용됩니다. 대부분의 경우 트랜잭션에 명시적으로 액세스할 필요가 없습니다. 데이터베이스 연결의 경우 ADO.NET Connection.Open
메서드가 호출되면 자동으로 Transaction.Current
확인하고 연결 문자열에서 Enlist
키워드가 false로 설정되지 않는 한 해당 트랜잭션에 연결을 투명하게 등록합니다.
다음 시나리오에서 직접 Transaction
개체를 사용할 수 있습니다.
자동 인리스트먼트를 수행하지 않는 리소스를 등록하려는 경우 또는 어떤 이유로든 초기화 중에 등록되지 않은 경우.
트랜잭션에 리소스를 명시적으로 등록하려는 경우
저장 프로시저 또는 함수 내에서 외부 트랜잭션을 종료하려는 경우 이 경우 TransactionScope. 예를 들어 다음 코드는 현재 트랜잭션을 롤백합니다.
using(TransactionScope transactionScope = new TransactionScope(TransactionScopeOptions.Required)) { }
이 문서의 나머지 부분에는 외부 트랜잭션을 취소하는 다른 방법이 설명됩니다.
외부 트랜잭션 취소
관리되는 프로시저나 함수에서 다음과 같은 방법으로 외부 트랜잭션을 취소할 수 있습니다.
관리 프로시저 또는 함수는 출력 매개 변수를 사용하여 값을 반환할 수 있습니다. 호출 Transact-SQL 프로시저는 반환된 값을 확인하고, 해당하는 경우
ROLLBACK TRANSACTION
실행할 수 있습니다.관리 프로시저 또는 함수는 사용자 지정 예외를 throw할 수 있습니다. 호출 Transact-SQL 프로시저는 try/catch 블록에서 관리 프로시저 또는 함수에 의해 throw된 예외를 catch하고
ROLLBACK TRANSACTION
실행할 수 있습니다.관리 프로시저 또는 함수는 특정 조건이 충족되는 경우
Transaction.Rollback
메서드를 호출하여 현재 트랜잭션을 취소할 수 있습니다.
Transaction.Rollback
메서드는 관리 프로시저 또는 함수 내에서 호출될 때 모호한 오류 메시지와 함께 예외를 throw하고 try/catch 블록에 래핑할 수 있습니다. 오류 메시지는 다음 출력과 유사합니다.
Msg 3994, Level 16, State 1, Procedure uspRollbackFromProc, Line 0
Transaction is not allowed to roll back inside a user defined routine, trigger or aggregate because the transaction is not started in that CLR level. Change application logic to enforce strict transaction nesting.
이 예외가 예상되며 코드 실행을 계속하려면 try/catch 블록이 필요합니다. try/catch 블록이 없으면 예외가 호출 Transact-SQL 프로시저에 즉시 throw되고 관리 코드 실행이 완료됩니다. 관리 코드 실행이 완료되면 또 다른 예외가 발생합니다.
Msg 3991, Level 16, State 1, Procedure uspRollbackFromProc, Line 1
The context transaction which was active before entering user defined routine, trigger or aggregate " uspRollbackFromProc " has been ended inside of it, which is not allowed. Change application logic to enforce strict transaction nesting. The statement has been terminated.
이 예외도 예상되며 실행을 계속하려면 트리거를 실행하는 작업을 수행하는 Transact-SQL 문 주위에 try/catch 블록이 있어야 합니다. 두 가지 예외가 발생해도 트랜잭션이 롤백되고 변경 내용이 커밋되지 않습니다.
예시
다음 코드는 Transaction.Rollback
메서드를 사용하여 관리 프로시저에서 롤백되는 트랜잭션의 예입니다. 관리 코드에서 Transaction.Rollback
메서드 주위의 try/catch 블록을 확인합니다. Transact-SQL 스크립트는 어셈블리 및 관리 저장 프로시저를 만듭니다.
EXEC uspRollbackFromProc
문은 try/catch 블록으로 래핑되므로 관리 프로시저가 실행을 완료할 때 throw되는 예외가 catch됩니다.
-
C#
-
Visual Basic .NET
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Transactions;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void uspRollbackFromProc()
{
using (SqlConnection connection = new SqlConnection(@"context connection=true"))
{
// Open the connection.
connection.Open();
bool successCondition = true;
// Success condition is met.
if (successCondition)
{
SqlContext.Pipe.Send("Success condition met in procedure.");
// Perform other actions here.
}
// Success condition is not met, the transaction will be rolled back.
else
{
SqlContext.Pipe.Send("Success condition not met in managed procedure. Transaction rolling back...");
try
{
// Get the current transaction and roll it back.
Transaction trans = Transaction.Current;
trans.Rollback();
}
catch (SqlException ex)
{
// Catch the expected exception.
// This allows the connection to close correctly.
}
}
// Close the connection.
connection.Close();
}
}
};
Transact-SQL 어셈블리 등록 및 실행
어셈블리를 등록합니다.
CREATE ASSEMBLY TestProcs FROM 'C:\Programming\TestProcs.dll'; GO CREATE PROCEDURE uspRollbackFromProc AS EXTERNAL NAME TestProcs.StoredProcedures.uspRollbackFromProc; GO
프로시저를 실행합니다.
BEGIN TRY BEGIN TRANSACTION; -- Perform other actions. EXECUTE uspRollbackFromProc; -- Perform other actions. PRINT N'Commiting transaction...'; COMMIT TRANSACTION; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNum, ERROR_MESSAGE() AS ErrorMessage; PRINT N'Exception thrown, rolling back transaction.'; ROLLBACK; PRINT N'Transaction rolled back.'; END CATCH GO
환경을 정리합니다.
DROP PROCEDURE uspRollbackFromProc; GO DROP ASSEMBLY TestProcs; GO
관련 콘텐츠
- CLR 통합 및 트랜잭션