Trên thực tế, tôi không bao giờ bắt đầu một giao dịch mới nếu tôi đã tham gia một giao dịch.
Điều này đề cập đến các procs được lưu trữ lồng nhau, các TXN được phân phối và TransactionScope
Hãy nhớ rằng có không có cái gọi là giao dịch lồng nhau trong SQL Server dù sao.
DECLARE @StartTranCount int
BEGIN TRY
SET @StartTranCount = @@TRANCOUNT
IF @StartTranCount = 0 BEGIN TRAN
-- my code
IF @StartTranCount = 0 COMMIT TRAN
END TRY
BEGIN CATCH
IF @StartTranCount = 0 AND @@trancount > 0
BEGIN
ROLLBACK TRAN
DECLARE @message NVARCHAR(MAX)
DECLARE @state INT
SELECT @message = ERROR_MESSAGE(), @state = ERROR_STATE()
RAISERROR (@message, 11, @state)
END
/*
or just
IF @StartTranCount = 0 AND @@trancount
ROLLBACK TRAN
*/
END CATCH