zoukankan      html  css  js  c++  java
  • 数据库事务

    数据库事务

     

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

    1、事务的特点

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

    事务的ACID属性

    原子性(Atomicity

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

    一致性(Consistency

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

    隔离性(Isolation

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

    一个事务不可能遇到另一个事务的中间状态。

    持久性(Durability

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

    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事务语句:

            abegin transaction语句

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

            bcommit transaction语句

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

            crollback 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 catch
    if (@tran_error > 0)
        begin
            --执行出错,回滚事务
            rollback tran;
            print '转账失败,取消交易';
        end
    else
        begin
            --没有异常,提交事务
            commit tran;
            print '转账成功';
        end
    go

     

  • 相关阅读:
    多叉树
    PowerDesigner设置集锦(2)
    Delphi应用程序在命令行下带参数执行返回命令行提示的问题
    不允许在 '*******' 上使用扩展属性,或对象不存在
    仓库管理系统开发完成
    动态创建Frame窗体(根据类名,除T以外的字母)
    Access中的常用TSQL
    批量删除同类文件(带通配符)
    判断Access数据库中的表或查询是否存在的SQL
    序列化FastReport,重要提示少走弯路
  • 原文地址:https://www.cnblogs.com/JohnTang/p/11975231.html
Copyright © 2011-2022 走看看