SQL事务

1.本地事务

  语法:

  BEGIN { TRAN | TRANSACTION } [ { transaction_name | @tran_name_variable } [ WITH MARK [   'description' ] ] ] [ ; ]

 参数:

transaction_name:分配给事务的名称。transaction_name 必须符合标识符规则,但标识符所包含的字符数不能大于 32

@tran_name_variable:用户定义的、含有有效事务名称的变量的名称。必须用 charvarcharncharnvarchar 数据类型声明变量。如果传递给该变量的字符多于 32 个,则仅使用前面的 32 个字符;其余的字符将被截断。

WITH MARK [ 'description' ]:指定在日志中标记事务。description 是描述该标记的字符串。长于 128 个字符的 description 先截断为 128 个字符,然后才存储到 msdb.dbo.logmarkhistory 表中

**如果使用了 WITH MARK,则必须指定事务名。WITH MARK 允许将事务日志还原到命名标记

示例:

begin transaction tran_name
--执行语句
if @@ERROR<>0
rollback transaction tran_name
else
commit transaction tran_name

 **标记一个显式本地事务的起始点。BEGIN TRANSACTION 使 @@TRANCOUNT 按 1 递增。COMMIT TRANSACTION 使 @@TRANCOUNT 按 1 递减,ROLLBACK TRANSACTION 都将 @@TRANCOUNT 系统函数减小为 0。ROLLBACK TRANSACTION savepoint_name 不减小 @@TRANCOUNT

2.分布事务

使用 BEGIN DISTRIBUTED TRANSACTION 语句启动显式分布式事务。

语法:

BEGIN DISTRIBUTED { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] [ ; ]

参数:

transaction_name:用户定义的事务名,用于跟踪 MS DTC 实用工具中的分布式事务。transaction_name 必须符合标识符规则,字符数必须 <= 32。

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

示例:
BEGIN DISTRIBUTED TRANSACTION;
执行语句
COMMIT TRANSACTION;
GO

3.应该怎样处理事务过程产生的问题:

  1.sql server 在发生 runtime 错误时,默认会 rollback 引起错误的语句,而继续执行后续语句。

  解决1:

   在事务语句最前面加上set xact_abort on

  示例:

set xact_abort on
begin transaction
--sql语句
commit transaction

当 xact_abort 选项为 on 时,sql server 在遇到错误时会终止执行并 rollback 整个事务

解决2:

  执行完一条sql 就判断@@error 状态

begin transaction
       --执行sql  语句1

      if @@error <> 0
      begin
         rollback transaction
 
      end

       --执行sql  语句2

      if @@error <> 0
       begin
         rollback tran
       
      end

   commit tran
   go
3.TRY ..Catch处理异常

  begin tran
   begin try
     --执行sql  语句1
     --执行sql  语句2
     --执行sql  语句3
      drop table verbal
   end try
   begin catch
      if @@trancount > 0
         rollback tran
   end catch

   if @@trancount > 0
      commit tran
   go

  • ERROR_NUMBER() 返回错误号。

  • ERROR_SEVERITY() 返回严重性。

  • ERROR_STATE() 返回错误状态号。

  • ERROR_PROCEDURE() 返回出现错误的存储过程或触发器的名称。

  • ERROR_LINE() 返回导致错误的例程中的行号。

  • ERROR_MESSAGE() 返回错误消息的完整文本。该文本可包括任何可替换参数所提供的值,如长度、对象名或时间。

 

 

 

原文地址:https://www.cnblogs.com/linsu/p/2459490.html