zoukankan      html  css  js  c++  java
  • SQLSERVER 数据库事务和异常处理代码

    1.定义:

    事务是作为单个逻辑单元执行的一系列操作,它是一个不可分割的工作逻辑单元。它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。

    举个例子,我们经常用到的 ATM 存取款机,比如转账的时候,是先减去转出账户的金额,然后再在指定转入账户的金额加上转出的金额。如果刚好这个时候转出的操作已经执行完成,但是由于系统的故障,导致转入的操作失败了。那么怎么办?这就需要用到事务了,只要事务里面有一条命令未成功执行,那么数据就会回滚到事务开始之前的状态。

    2.特性

    (1) 原子性(Atomicity):事务是一个完整的操作, 事务中所有操作命令必须作为一个整体提交或回滚。如果事务中任何操作命令失败,则整个事务将因失败而回滚。

    (2) 一致性(Consistency):当事务完成时,数据都处于一致状态。

    (3) 隔离性(Isolation): 对数据进行修改的所有并发事务是彼此隔离的,它不以任何方式依赖或影响其他事务。

    (4) 持久性(Durability):事务提交之后,数据是永久性的,不可再回滚。

    3.操作:

    (1) begin transaction:开始事务。

    (2) commit transaction:提交事务。

    (3) rollback transaction:回滚事务。

    (4) save transaction:事务保存点。即事务回滚时,可以指定回滚到保存点,而不进行全部回滚。

    4.分类:

    (1) 显式事务:用 begin transaction 明确指定事务的开始,由 commit transaction 提交事务、rollback transaction 回滚事务到事务结束。

    (2) 隐式事务:通过设置 set implicit_transactions on 语句,将隐式事务模式设置为打开。当以隐式事务模式操作时,不必使用 begin transaction 开启事务,当一个事务结束后,这个模式会自动启用下一个事务,只需使用 commit transaction 提交事务或 Rollback Transaction 回滚事务即可。

    (3) 自动提交事务: 这是 SQL Server 的默认模式,它将每条单独的 T-SQL 语句视为一个事务。如果成功执行,则自动提交。如果错误,则自动回滚。

    5.实例

     事务在存储过程中使用,只需在第一级存储过程中使用就可以了

    --下方代码是获取系统错误后回滚事务的代码,还需自定义业务异常条件,满足后进行提示并回滚(即非必须触发异常处理代码才能回滚)
    --处理异常代码和事务代码非必须配合代码,可以单独使用
    
    --@@error,@@trancount是全局变量,只要发生错误@@error就不等于0,只要执行一次事务@@trancount就+1,回滚会变为0
    
      
    
    SET NOCOUNT ON --当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。
    
    DECLARE @ProcessState INT=0 --业务异常状态
    
    begin tran -- 开启事务,transcation 的简写
    --declare @errorNo int --定义变量,用于记录事务执行过程中的错误次数
    --set @errorNo=0
    begin try
    select 1/0 as aa
    
    --if(@errorNo>0)
    --begin
    -- --抛出自定义的异常,在最后的catch块中统一处理异常
    -- RAISERROR(233333,16,3)
    --end
    --根据业务异常状态判断是否需要回滚
    set @ProcessState=1
    if @ProcessState<>0
    begin
    rollback tran; -- 回滚事务
    RETURN
    end
    end try
    begin catch
    
    --此处为异常提示信息,可以拼接为字符串
    select ERROR_NUMBER() errorNumber, --错误代码
    ERROR_SEVERITY() errorSeverity, --错误严重级别,级别小于10 try catch 捕获不到
    ERROR_STATE() errorState, --错误状态码
    ERROR_PROCEDURE() errorProcedure, --出现错误的存储过程或触发器的名称
    ERROR_LINE() errorLine, --发生错误的行号
    ERROR_MESSAGE() errorMessage --错误的具体信息
    
    
    if(@@trancount>0) -- @@trancount 系统全局变量,事务开启 @@trancount 值+1,判断事务是否开启
    begin
    rollback tran; -- 回滚事务
    end
    end catch
    
    if(@@trancount>0)
    begin
    commit tran; -- 提交事务
    end
    
    select 1
  • 相关阅读:
    JS各种各样的拖动效果
    GridView实现自动编号
    通用海量数据库翻页
    设置首页和添加到收藏夹的JavaScript代码
    JavaScript弹出窗口总结
    JavaScript获取窗口的高度和宽度
    精妙SQL语句
    Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)
    GridView数据导入Excel
    网站采集
  • 原文地址:https://www.cnblogs.com/Bokeyan/p/13839931.html
Copyright © 2011-2022 走看看