【发布时间】:2017-11-10 22:20:16
【问题描述】:
当我执行这个存储过程时,即使IF 语句是正确的,我也无法在IF 块中回滚。如果IF 语句是正确的,脚本最终仍然在运行并且根本没有回滚。
消息:账号id已经使用成功注册
消息 3902,级别 16,状态 1,过程 PROC_DANGKY,第 23 行
COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
代码:
CREATE PROCEDURE PROC_REGISTER
@name nvarchar(30),
@birth datetime,
@passport nvarchar(9),
@address nvarchar(50),
@phone nvarchar(11),
@email nvarchar(20),
@account nvarchar(30),
@password nvarchar(20)
AS
BEGIN TRAN
BEGIN TRY
IF (EXISTS(SELECT * FROM CUSTOMER WHERE ACCOUNT = @account))
BEGIN
PRINT N'The account id has already been used'
ROLLBACK TRAN
END
INSERT INTO KHACHHANG
VALUES (@name, @birth, @passport, @address, @phone, @email, @account, @password)
PRINT N'Successfully registered'
END TRY
BEGIN CATCH
DECLARE @ErrorMsg VARCHAR(2000)
SELECT @ErrorMsg = N'Error: ' + ERROR_MESSAGE()
RAISERROR(@ErrorMsg, 16,1)
ROLLBACK TRAN
RETURN
END CATCH
COMMIT TRAN
【问题讨论】:
-
当你检查 EXISTS 时你什么都不做,所以你不必回滚,插入后你提交而不是从外部提交
标签: sql sql-server stored-procedures transactions