存储过程中的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