一个带事务的Sql Server存储过程例子


Create PROCEDURE [dbo].[sp_Delete_TranSample]     	
AS
BEGIN 
--SET NOCOUNT ON; --(注意:SET NOCOUNT ON 不返回受影响的行数, 前端ExecuteNonQuery  得到的受影响行数为-1)

BEGIN
BEGIN TRY
       BEGIN TRAN	   
        DELETE  FROM table1 WHERE ....
		DELETE  FROM table2 WHERE ....	
    COMMIT TRAN
 END TRY
BEGIN CATCH
   --ROLLBACK TRAN --放在这里也可以		
        IF @@TRANCOUNT > 0  --(存在未执行成功的事务,则回滚. 注1)
        BEGIN
            ROLLBACK TRAN	
            --PRINT ERROR_MESSAGE()				
        END     
 END CATCH
 END
--注1:每一次Begin Transaction都会引起@@TranCount加1。而每一次Commit Transaction都会使@@TranCount减1,而RollBack Transaction会回滚所有的嵌套事务包括已经提交的事务和未提交的事务,而使@@TranCount置0。


另一例子:

Create PROCEDURE sp_copy_JobRegMasterDetail(
@masterRefNo int, --Job_Reg_Master's RefNo field
@JobNo AS varchar(50), --Job_Reg_Master's JobNo field
@JobNoType AS varchar(20) --Job Type. default 'JS'
)
AS
BEGIN
 BEGIN TRY
    BEGIN TRAN	
	
 -- 1. Insert Job_Reg_Master
		INSERT INTO Job_Reg_Master Values(...)	
		
-- 2. Insert Job_Reg_Detail
IF @@ROWCOUNT = 0
     BEGIN
	   SELECT 0
	   RETURN
	 END

	 DECLARE @RefNo_Details as INT
	 DECLARE curDetail CURSOR FOR 
	    SELECT RefNo FROM  Job_Reg_Details where JobNo = @JobNo and Status = 'A' Order by ItemNo  
     OPEN curDetail
	 FETCH NEXT FROM curDetail INTO @RefNo_Details
	 WHILE (@@FETCH_STATUS != -1)
	   BEGIN	      
		   INSERT INTO Job_Reg_Details VALUES(...)		
		  FETCH NEXT FROM curDetail INTO @RefNo_Details
	   END
	 CLOSE curDetail
	 DEALLOCATE curDetail
    COMMIT TRAN
 END TRY
 BEGIN CATCH
   IF @@TRANCOUNT > 0
     BEGIN
     --PRINT ERROR_MESSAGE()
    ROLLBACK TRAN
       SELECT 0
     END
 END CATCH

END
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值