2012-07-17 26 views
5

Tôi đang sử dụng SQL Server 2012 và tôi đã viết một quy trình được lưu trữ nhỏ với giao dịch rollback. thủ tục của tôi là như sau:nếu @@ Trancount> 0 không hoạt động

ALTER PROCEDURE [dbo].[uspInsertEmployee] 
@EmpId int, 
@EmployeeName varchar(50), 
@DeptId int 
AS 
BEGIN 
BEGIN TRY 

insert into Departments values (@DeptId, 'Testing 1'); 
insert into Employees values (@EmpId, @EmployeeName, @DeptId); 

END TRY 
BEGIN CATCH 

--log error here 
Goto Error_Rollback 
END CATCH 

Error_Rollback: 

IF @@TRANCOUNT > 0 
BEGIN 
    print 'rolling back transaction' /* <- this is never printed */ 
    ROLLBACK TRAN 
END 
END 

Như bạn có thể thấy, trong điều kiện Nếu, khi @@ trancount> 0, tôi đang cố gắng để rollback giao dịch, nhưng khi tôi thực hiện các thủ tục, báo cáo kết quả rollback là không bao giờ được thực thi, tôi đã gỡ rối quy trình và giá trị của @@ TRANCOUNT là 1. Nhưng tôi vẫn không hiểu tại sao nó không hoạt động. Và tôi đã biết rằng chúng ta không cần sử dụng tran bắt đầu và kết thúc cho rollback.

Bất kỳ ai cũng có thể giúp tôi giải quyết vấn đề này.

EDIT

Xin lỗi tôi quên đề cập đến đó, một lỗi xảy ra trong báo cáo chèn thứ hai.

Trả lời

5

Bạn đã bắt đầu một giao dịch ngầm. để cuộn lại, bạn cần bắt đầu một giao dịch rõ ràng (BEGIN TRANSACTION)

ALTER PROCEDURE [dbo].[uspInsertEmployee] 
    @EmpId int, 
    @EmployeeName varchar(50), 
    @DeptId int 
AS 

BEGIN 

BEGIN TRY 
    BEGIN TRAN 
    insert into Departments values (@DeptId, 'Testing 1'); 
    insert into Employees values (@EmpId, @EmployeeName, @DeptId); 
    COMMIT TRAN 
END TRY 

BEGIN CATCH 
    --log error here 
Goto Error_Rollback 
END CATCH 

Error_Rollback: 

    IF @@TRANCOUNT > 0 
    BEGIN 
    print 'rolling back transaction' /* <- this is never printed */ 
    ROLLBACK TRAN 
    END 

END 
+0

bạn muốn nói rằng không có giao dịch rõ ràng, @@ giá trị trancount sẽ luôn là số không? nhưng tôi trong khi gỡ lỗi, tôi thấy @@ trancount giá trị như 1. nhưng im không sử dụng bất kỳ tran bắt đầu và cam tran. – Harsha

+1

Đây là một giao dịch Autocommit và không ngầm, trừ khi SET IMPLICIT_TRANSACTION ON, hoặc SET ANSI DEFAULTS ON, mặc dù câu trả lời là chính xác. –