存储过程中使用事务——机房重构

    存储过程中使用事务是很重要的,使用事务可以保持数据的关联完整性.事务处理生活中无处不在。例如取款机,如果我们在取钱的时候停电了,或者是其他的意外,这就需要事务处理,如果不加事务处理,可能我们的银行卡里的钱被扣掉了,而没有取出来,就悲剧了。


一、语法:

 Create Procedure  MyProcedure

 (   @Param1       nvarchar( 10),

 @param2    nvarchar( 10)

    )

    AS

       Begin

           Set    NOCOUNT    ON;

           Set XACT_ABORT ON;

           Begin  Tran

              Delete from       table1 where name=’abc’;

              Insert into       table2 values(value1,value2,value3);

           Commit Tran

       End


    使用存储过程执行事务,需要开启XACT_ABORT参数为on,此时如果SQL语句产生运行时错误,整个事务将终止并回滚;为OFF时,只回滚产生错误的SQL语句,而事务将继续进行处理。

 

    举例:机房收费系统中的充值

-- =============================================
-- Author:		刘腾腾
-- Create date: 2013/3/10
-- 充值
-- =============================================
ALTER PROCEDURE [dbo].[PROC_RechargeBLL]
	 @cardNo varchar(10),@reCharge numeric(18,1),@handlers varchar(10),@isCheck varchar(10),@rechargeDate varchar(10),@rechargeTime varchar(10),@cardCash numeric(18,1)
	
AS
BEGIN
          Set    NOCOUNT    ON;
           Set XACT_ABORT ON;
           begin   tran  ok  --开始一个事务OK 


--充值表中写信息
	insert into T_Recharge(cardNo,reCharge ,handlers,isCheck ,rechargeDate ,rechargeTime )values(@cardNo,@reCharge ,@handlers,@isCheck,@rechargeDate,@rechargeTime)

 save   tran  bcd   --保存一个事务点命名为bcd

 --更新卡中余额
 update T_Card set cardCash =@cardCash+@reCharge where cardNo=@cardNo  
 
    if @@error <>0  --判断修改数据有没有出错   
 
               begin --如果出错  

                      rollback   tran  bcd  -- 回滚事务到bcd 的还原点
 
                   commit   tran  ok  --提交事务
      
               end   
 
           else  --没有出错
 
               commit  tran ok --提交事务  

 
END
      在事务中设置了一个保存点,如果事务回滚到保存点的位置,必须继续完成事务,否则将事务回滚到起始点完成取消事务操作。

二、事务特点:

1、原子性。事务是一个单元的工作,要么全做,要么全部做;

2、一致性。事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

3、隔离性。一个事物的执行不能被其他事务干扰。

4、持续性/永久性。一个事物一旦提交,它对数据的改变就应该是永久性的。

 

三、事务的处理模型:

1、隐式事务是指每一条数据操作语句都自动地成为一个事务,每个事务都有显示的开始和结束标记。

2、显式事务是指有显式的开始和结束标记的事务,事务的开始是隐式的,结束有明确标记。

3、自动事务是系统自动默认的,开始和结束不用标记。


    PS:一开始在写存储过程的时候没有加事务处理,但是在后面的调试程序的过程中出现了SQL语句错误的问题,还有查不到内容的时候,于是加上了事务的处理。事务处理无处不在。


评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值