SQL Server 事务,异常和游标详解

2023-01-04 14:33:22 作者:admin

本文整理自网络,侵删。

目录
  • 事务
    • 1、 事务的特点
    • 2、 事务的模式
    • 3、 事务处理
    • 4、 事务的示例
  • 异常
    •  错误函数
    • 示例:用异常处理错误信息
    • 示例:异常能处理的错误信息
    • 示例:无法提交的事务
    • 示例:处理异常日志信息
  • 游标
    • 1、游标实际上是一种能从多条数据记录的结果集中每次提取一条记录的机制。
    • 2、游标的基本操作
    • 3、游标操作示例
  • 总结

    事务

    在数据库中有时候需要把多个步骤的指令当作一个整体来运行,这个整体要么全部成功,要么全部失败,这就需要用到事务。

    1、 事务的特点

    事务有若干条T-SQL指令组成,并且所有的指令昨晚一个整体提交给数据库系统,执行时,这组指令要么全部执行完成,要么全部取消。因此,事务是一个不可分割的逻辑单元。

    事务有4个属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)以及持久性(Durability),也称作事务的ACID属性。

    原子性:事务内的所有工作要么全部完成,要么全部不完成,不存在只有一部分完成的情况。

    一致性:事务内的然后操作都不能违反数据库的然后约束或规则,事务完成时有内部数据结构都必须是正确的。

    隔离性:事务直接是相互隔离的,如果有两个事务对同一个数据库进行操作,比如读取表数据。任何一个事务看到的所有内容要么是其他事务完成之前的状态,要么是其他事务完成之后的状态。一个事务不可能遇到另一个事务的中间状态。

    持久性:事务完成之后,它对数据库系统的影响是持久的,即使是系统错误,重新启动系统后,该事务的结果依然存在。

    2、 事务的模式

    a、 显示事务

    显示事务就是用户使用T-SQL明确的定义事务的开始(begin transaction)和提交(commit transaction)或回滚事务(rollback transaction

    b、 自动提交事务

    自动提交事务是一种能够自动执行并能自动回滚事务,这种方式是T-SQL的默认事务方式。例如在删除一个表记录的时候,如果这条记录有主外键关系的时候,删除就会受主外键约束的影响,那么这个删除就会取消。

    可以设置事务进入隐式方式:set implicit_transaction on;

    c、 隐式事务

    隐式事务是指当事务提交或回滚后,SQL Server自动开始事务。因此,隐式事务不需要使用begin transaction显示开始,只需直接失业提交事务或回滚事务的T-SQL语句即可。

    使用时,需要设置set implicit_transaction on语句,将隐式事务模式打开,下一个语句会启动一个新的事物,再下一个语句又将启动一个新事务。

    3、 事务处理

    常用T-SQL事务语句:

    a、 begin transaction语句

    开始事务,而@@trancount全局变量用来记录事务的数目值加1,可以用@@error全局变量记录执行过程中的错误信息,如果没有错误可以直接提交事务,有错误可以回滚。

    b、 commit transaction语句

    回滚事务,表示一个隐式或显示的事务的结束,对数据库所做的修改正式生效。并将@@trancount的值减1;

    c、 rollback transaction语句

    回滚事务,执行rollback tran语句后,数据会回滚到begin tran的时候的状态

    4、 事务的示例

    begin transaction tran_bank;declare @tran_error int;    set @tran_error = 0;    begin try        update bank set totalMoney = totalMoney - 10000 where userName = 'jack';                set @tran_error = @tran_error + @@error;        update bank set totalMoney = totalMoney + 10000 where userName = 'jason';        set @tran_error = @tran_error + @@error;    end try    begin catch                print '出现异常,错误编号:' + convert(varchar, error_number()) + ', 错误消息:' + error_message();         set @tran_error = @tran_error + 1;    end catchif (@tran_error > 0)    begin        --执行出错,回滚事务        rollback tran;        print '转账失败,取消交易';    endelse    begin        --没有异常,提交事务        commit tran;        print '转账成功';    endgo

    异常

    在程序中,有时候完成一些Transact-SQL会出现错误、异常信息。如果我们想自己处理这些异常信息的话,需要手动捕捉这些信息。那么我们可以利用try catch完成。

    TRY…CATCH 构造包括两部分:一个 TRY 块和一个 CATCH 块。如果在 TRY 块中所包含的 Transact-SQL 语句中检测到错误条件,控制将被传递到 CATCH 块(可在此块中处理该错误)。

    CATCH 块处理该异常错误后,控制将被传递到 END CATCH 语句后面的第一个 Transact-SQL 语句。如果 END CATCH 语句是存储过程或触发器中的最后一条语句,控制将返回到调用该存储过程或触发器的代码。将不执行 TRY 块中生成错误的语句后面的 Transact-SQL 语句。

    如果 TRY 块中没有错误,控制将传递到关联的 END CATCH 语句后紧跟的语句。如果 END CATCH 语句是存储过程或触发器中的最后一条语句,控制将传递到调用该存储过程或触发器的语句。

    阅读剩余部分

    相关阅读 >>

    sql语句执行顺序优先级是什么?

    oracle中以insert values的形式同时插入多条记录

    sql as的用法是什么

    sql中标识列有什么作用

    mysql怎么修改字段类型?

    navicat和sql的关系

    sql增加字段的语句是什么

    sql语言中,删除一个表的命令是什么

    sql注入语句是什么

    sql语句执行顺序是什么

    更多相关阅读请进入《sql》频道 >>


    数据库系统概念 第6版
    书籍

    数据库系统概念 第6版

    机械工业出版社

    本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



    在线咨询 拨打电话