繁体   English   中英

存储过程中的SQL事务处理

[英]SQL Transaction Handling in stored procedure

我已经编写了一个存储过程,以检查事务在存储过程中的工作方式。

这个对吗? 我如何检查是否正确?

我想做的是是否不删除第二个表数据; 这两个表数据均不应删除。

CREATE PROCEDURE DeleteDepartment
(
   @DepartmentID    int
)
AS
   BEGIN TRANSACTION

   DELETE FROM Employees
   WHERE DepartmentID = @DepartmentID

   IF @@ERROR <> 0
   BEGIN
        -- Rollback the transaction
        ROLLBACK

        -- Raise an error and return
        RAISERROR ('Error in deleting employees in DeleteDepartment.', 16, 1)
        RETURN
   END

   DELETE FROM Departments
   WHERE DepartmentID = @DepartmentID

   IF @@ERROR <> 0
   BEGIN
       -- Rollback the transaction
       ROLLBACK

       -- Raise an error and return
       RAISERROR ('Error in deleting department in DeleteDepartment.', 16, 1)
       RETURN
   END

   COMMIT
CREATE PROCEDURE DeleteDepartment
(
   @DepartmentID    int
)
AS


BEGIN TRY 

BEGIN TRANSACTION

DELETE FROM Employees
WHERE DepartmentID = @DepartmentID

--Test Code Start
--For testing purpose Add an Insert statement with passing value in the identity column.
declare @table1 as table(ID Identity(1,1),Test varchar(10))

insert into @table1(ID, Test)
Values(1,'Failure Test')
--Test Code end

DELETE FROM Departments
WHERE DepartmentID = @DepartmentID


COMMIT TRANSACTION
END TRY

BEGIN CATCH
        ROLLBACK TRANSACTION
        RETURN ERROR_MESSAGE()
END CATCH

首先, Commit transaction出现在Rollback Transaction

为了测试事务是否有效,您可以做的是,尝试在查询中的2条delete语句之间添加INSERT语句,并尝试为其中的identity列添加值。 这样第一次删除成功,但是事务失败。 现在,您可以检查表中是否反映了第一次删除。

COMMIT应该在ROLLBACK之前。 我建议使用try / catch块它应该看起来像这样

BEGIN TRY
    declare @errorNumber as int
BEGIN TRANSACTION 

     --do 1st statement
     IF @@ERROR<>0
     BEGIN
       SET @errorNumber=1
     END

     --do 2nd statement
     IF @@ERROR<>0
     BEGIN
       SET @errorNumber=2
     END

 COMMIT

END TRY

BEGIN CATCH

    IF @@TRANCOUNT > 0

ROLLBACK

END CATCH

您的存储过程将正常工作,但我添加了一些内容

CREATE PROCEDURE DeleteDepartment
(  @DepartmentID    int
)
AS

BEGIN TRANSACTION
BEGIN TRY
   DELETE FROM Employees 
   WHERE DepartmentID = @DepartmentID

   DELETE FROM Departments 
   WHERE DepartmentID = @DepartmentID

   COMMIT   
END TRY
BEGIN CATCH
   ROLLBACK

    -- Raise an error and return
    RAISERROR (ERROR_MESSAGE(), 16, 1)
END CATCH

END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM