存储过程中的事务处理
我写了一个带有事务的存储过程,在查询分析器中执行的时候,我故意让它出错,结果是提示如下的错误:
サーバー : メッセージ 2627、レベル 14、状態 1、プロシージャ Retir、行 59
PRIMARY KEY 違反、制約 'PK_T_D_BackCondition ': オブジェクト 'T_D_BackCondition ' には重複したキーは挿入できません。
ステートメントは終了されました。
这样的结果是表示我的事务处理已经成功了吗?已经执行了回滚了吗?
我的意思就是如何判断我的事务处理是正确的,就是如何验证事务是正确的执行了。
急需大家的帮助,我都快被它搞晕了,谢谢
------解决方案--------------------所谓的事务,就是你进行多项操作,当其中任何一项操作执行有误,通过事务能够恢复操作前的状态,基于此,你就看看有没有达到这样的要求,一般来说执行一个事务在语法和逻辑都正确的前提下是不会出错的
------解决方案--------------------DECLARE @ERRORNUM INT
BEGIN TRANSACTION
SET @ERRORNUM=0
你的SQL语句或代码............................
每一句后面都加上 SET @ERRORNUM=@ERRORNUM+@@ERROR
有错误就回滚 无错误就提交
IF @ERRORNUM <> 0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
BEGIN
COMMIT TRANSACTION
END
------解决方案--------------------ALTER PROCEDURE [dbo].[test]
@from varchar(50),
@to varchar(50),
@num int
AS
BEGIN TRY
BEGIN TRAN;
update vc set balance = balance - @num where [name] = @from;
update vc set balance = balance + @num where [name] = @to;
COMMIT TRAN;
END TRY
BEGIN CATCH
ROLLBACK TRAN
EXEC PE_THROW;
END CATCH
自定义的pe_throw存储过程如下:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
/*****************************************************************
-- 过程名:PE_THROW
-- 输 入:
-- 输 出:
-- 抛出异常
-- 功能描述: 接收调用程序的异常并抛给上一级程序. 注意每个数据库都应包含该过程.
-- 调用模块: 所有包含事务控制的过程
-- 操作表
-- 作 者:
-- 日 期: 2007-01-30
-- 修 改:
-- 日 期:
-- 版本
****************************************************************/
ALTER PROCEDURE [dbo].[PE_THROW]
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@ErrorMessage NVARCHAR(4000),
@ErrorNumber INT,
@ErrorSeverity INT,
@ErrorState INT,
@ErrorLine INT,
@ErrorProcedure NVARCHAR(200);
SELECT
@ErrorNumber = ERROR_NUMBER(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE(),
@ErrorLine = ERROR_LINE(),
@ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '- ');
SELECT @ErrorMessage = N 'Error %d, Level %d, State %d, Procedure %s, Line %d, ' + 'Message: '+ ERROR_MESSAGE();
RAISERROR
(
@ErrorMessage,
@ErrorSeverity,
1,
@ErrorNumber,
@ErrorSeverity,
@ErrorState,
@ErrorProcedure,
@ErrorLine
);
END