Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储过程中的SQL事务处理_Sql_Sql Server_Stored Procedures - Fatal编程技术网

存储过程中的SQL事务处理

存储过程中的SQL事务处理,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我编写了一个存储过程来检查事务如何在存储过程中工作 这是正确的吗?如何检查这是否正确 我想做的是,如果第二个表数据没有被删除;不应同时删除这两个表数据 CREATE PROCEDURE DeleteDepartment ( @DepartmentID int ) AS BEGIN TRANSACTION DELETE FROM Employees WHERE DepartmentID = @DepartmentID IF @@ERROR <>

我编写了一个存储过程来检查事务如何在存储过程中工作

这是正确的吗?如何检查这是否正确

我想做的是,如果第二个表数据没有被删除;不应同时删除这两个表数据

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
创建程序删除部门
(
@部门ID int
)
作为
开始交易
从员工中删除
其中DepartmentID=@DepartmentID
如果@错误0
开始
--回滚事务
回降
--提出错误并返回
RAISERROR('删除部门中的员工时出错',16,1)
返回
结束
从部门中删除
其中DepartmentID=@DepartmentID
如果@错误0
开始
--回滚事务
回降
--提出错误并返回
RAISERROR('DeleteDepartment'中删除部门时出错',16,1)
返回
结束
犯罪

提交应该在回滚之前。我建议使用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
开始尝试
将@errorNumber声明为int
开始交易
--做第一次陈述
如果@@ERROR0
开始
设置@errorNumber=1
结束
--做第二次陈述
如果@@ERROR0
开始
设置@errorNumber=2
结束
犯罪
结束尝试
开始捕捉
如果@TRANCOUNT>0
回降
端接
首先,
提交事务
出现在
回滚事务


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

您的存储过程可以工作,但我添加了一些位

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

您使用的是哪个版本的SQL server?SQL server Management Studio 2008有2次回滚。你说的是哪一个回滚?看起来你正在尝试两次相同的删除操作。如果只有一个DELETE语句,这将更正。(我的意见)您可以轻松地将这两条语句放在一个TRY块中,然后再提交。那么我如何确定第一条语句中是否有错误?您应该解释您所做的事情,以及为什么这会有好处!我不明白如何检查这是否正确。当您在开始和提交事务之间放置某些内容时。它将作为一个整体工作。但是如果你想测试它,它会按照你的期望工作。我会更新我的答案,以显示一种快速测试方法
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