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
  • 相关阅读:
    Running APP 使用说明
    Android 控件八 WebView 控件
    Android 控件七 ImageView 控件
    Android 控件六 CheckBox 控件
    Android 控件五 RadioButton 控件
    Android 控件四 EditText 控件
    Android 控件三 TextView 控件实现 Button
    Android 控件二 Button
    Android 基础控件演示实例
    Android 控件一 TextView
  • 原文地址:https://www.cnblogs.com/Bokeyan/p/13839931.html
Copyright © 2011-2022 走看看