Ich benutze SQL Server 2012 und ich schrieb eine kleine gespeicherte Prozedur mit Rollback-Transaktion. Mein Verfahren ist wie folgt:Wenn @@ Trancount> 0 funktioniert nicht
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
Wie Sie in der If-Bedingung sehen können, wenn @@ TRANCOUNT> 0, Ich versuche, die Transaktion rückgängig zu machen, aber wenn ich die Prozedur ausführen, die Rollback-Anweisung nie ausgeführt, habe ich die Prozedur debugged und der Wert von @@ TRANCOUNT ist 1. Aber ich verstehe immer noch nicht, warum es nicht funktioniert. Und ich habe gelernt, dass wir nicht beginnen müssen, tran und end tran für Rollback zu verwenden.
Kann mir jemand bei der Lösung dieses Problems helfen.
EDIT
Sorry, ich vergaß zu erwähnen, dass, tritt ein Fehler in der zweiten Insert-Anweisung.
Sie wollen sagen, dass ohne explizite Transaktion, @@ trancount Wert wird immer Null Ritus sein? aber ich während des Debuggens, sah ich @ trancount Wert als 1. aber ich benutze keine begin tran und commit tran. – Harsha
Dies ist eine Autocommit-Transaktion und keine implizite, außer SET IMPLICIT_TRANSACTION ON oder SET ANSI DEFAULTS ON, obwohl die Antwort korrekt ist. –