zoukankan      html  css  js  c++  java
  • 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() 返回错误消息的完整文本。该文本可包括任何可替换参数所提供的值,如长度、对象名或时间。

     

     

     

  • 相关阅读:
    【Nginx】使用Nginx做反向代理时,关于被代理服务器相应的超时设置
    【Quartz】配置最简单的集群
    【Quartz】将定时任务持久化到数据库
    【Quartz】Quartz的搭建、应用(单独使用Quartz)
    【Linux】用grep在文档中查找内容
    【Linux】方便的SecureCRT文件上传、下载命令
    【MySQL】MySQL复制表结构、表数据
    【Linux】vi(vim)起步学起来有些困难,一步一步温习
    【MySQL】MySQL PLSQL Demo
    【Linux】VMware中为CentOS设置静态IP(非动态获取IP)
  • 原文地址:https://www.cnblogs.com/linsu/p/2459490.html
Copyright © 2011-2022 走看看