存储过程中使用事务

Create PROCEDURE UpdateWanjun
@UserName nvarchar(500),
@UserPassword nvarchar(500),
@ReturnVal int output
AS  
   --Set XAcT_ABORT ON
  Begin Transaction T
      Update admins set UserPassword = @UserPassword where UserName = @UserName
      Update admins set UserPassword = @UserPassword,a='aaadfasdfasdfas' where id=4          --出错语句 ,a为int型,大小为默认值4
      --set @ReturnVal=@@Rowcount(这个变量,只能在紧挨着它的上面SQL下起作用,这样才能返回值,只有放在Update下面才管用)
  
  IF @@Error <> 0
   Begin
      Print '111' 
      RollBack Transaction T
    End
  Else
      print '222'
      COMMIT Transaction T
GO

####################################################################################

如果在一个存储过程中执行调用另一个服务器上的存储过程时,添加事务时需要使用

BEGIN DISTRIBUTED TRANSACTION来开始事务(分布式事务)

BEGIN DISTRIBUTED TRAN [ SACTION ]
     [ transaction_name | @tran_name_variable ]

参数

transaction_name

是用户定义的事务名,用于跟踪 MS DTC 实用工具中的分布式事务。transaction_name 必须符合标识符规则,但是仅使用头 32 个字符。

@tran_name_variable

是用户定义的一个变量名,它含有一个事务名,该事务名用于跟踪 MS DTC 实用工具中的分布式事务。必须用 charvarcharncharnvarchar 数据类型声明该变量。

注释

执行 BEGIN DISTRIBUTED TRANSACTION 语句的服务器是事务创建人,并且控制事务的完成。当连接发出后续 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句时,主控服务器请求 MS DTC 在所涉及的服务器间管理分布式事务的完成。

有两个方法可将远程 SQL 服务器登记在一个分布式事务中:

  • 分布式事务中已登记的连接执行一个远程存储过程调用,该调用引用一个远程服务器。

  • 分布式事务中已登记的连接执行一个分布式查询,该查询引用一个远程服务器。

例如,如果在 ServerA 上发出 BEGIN DISTRIBUTED TRANSACTION,该连接调用 ServerB 上的存储过程和 ServerC 上的另一个存储过程,并且 ServerC 上的存储过程对 ServerD 执行一个分布式查询,那么四个 SQL 服务器都进入分布式事务中了。ServerA 是该事务的创建者和控制服务器。

分布式事务 Transact-SQL 涉及的连接并不获取可以传给另一个连接的事务对象,从而也不能用该方法显式登记在分布式事务中。远程服务器登记到事务中的唯一方法是成为远程存储过程调用或分布式查询的目标。

默认情况下,任何有效用户都拥有 BEGIN DISTRIBUTED TRANSACTION 权限。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值