日期:2014-05-18  浏览次数:20535 次

存储过程中的事务处理
我写了一个带有事务的存储过程,在查询分析器中执行的时候,我故意让它出错,结果是提示如下的错误:
サーバー   :   メッセージ   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