[英]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.