zoukankan      html  css  js  c++  java
  • SQL SERVER 事务

    首先关于事务的几个操作如下:

    begin tran -- 开启事务
    commit tran -- 提交事务
    rollback tran -- 回滚事务

    -- 新建一个测试表demo,id自增
    create table demo
    (
    id int not null IDENTITY(1,1),
    val int not null
    )

    insert into demo values (5)
    insert into demo values (2)

    select * from demo

    set xact_abort on -- 设置当运行发生错误时,整个事务终止并回滚

    begin tran -- 开启事务
    insert into demo values (5)
    insert into demo values (2)
    insert into demo values (5)
    insert into demo values (null)
    insert into demo values (6)
    commit tran -- 提交事务
    go

    当执行到 insert into demo values (null) 这一句时会发生错误,因为设置了 set xact_abort on ,因此所有操作会回滚。

    操作结果:


    再看一下数据

    select * from demo

    跟刚刚一样,数据没有增加。

    接下来对比一下不设置 xact_abort on 的情况。

    set xact_abort off

    begin tran -- 开启事务
    insert into demo values (5)
    insert into demo values (2)
    insert into demo values (5)
    insert into demo values (null)
    insert into demo values (6)
    commit tran -- 提交事务
    go


    数据:

    select * from demo


    可以看到除了 insert into demo values (null) 这一句,其他数据是有插到数据库的。

    注意:
    关于事务回滚还有一点,我建的 demo 表的 id 字段是自增的。
    看最后的那张图,id=2 的下一条是 id=7,这说明了其实除了insert into demo values (null) 这一句,其他语句是已经执行了,插入到数据库了的,只是因为遇到错误回滚时又把它们删除了。所以再插入的时候 id 就是从7开始了。

    PS:其实不使用 set xact_abort on 也可以手动捕捉错误进行回滚。

    这里只是简单介绍一下。

    在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。
    begin transaction

    declare @errorSum int --定义局部变量
    set @errorSum=0 --初始化临时变量

    update bank set currentMoneycurrentMoney= currentMoney-1000 where customerName='张三'
    set @errorSum=@errorSum+@@error --累计是否有错误
    update bank set currentMoneycurrentMoney= currentMoney+1000 where customerName='李四'
    set @errorSum=@errorSum+@@error --累计是否有错误
    if @errorSum<>0 --如果有错误
    begin
    rollback transaction
    end

    else
    begin
    commit transaction
    end

    go


    2. 可利用 try…catch 异常处理机制。

    begin tran

    begin try
    update statement 1 ...
    delete statement 2 ...
    endtry

    begin catch
    if @@trancount > 0
    rollback tran
    end catch

    if @@trancount > 0
    commit tran
    go

  • 相关阅读:
    String 对象-->indexOf() 方法
    String 对象-->大小比较
    String 对象-->判断是否相等
    String 对象-->toUpperCase() 方法
    String 对象-->toLowerCase() 方法
    String 对象-->fromCharCode() 方法
    String 对象-->charCodeAt() 方法
    从零开始学 Web 之 CSS3(六)动画animation,Web字体
    从零开始学 Web 之 CSS3(五)transform
    从零开始学 Web 之 CSS3(四)边框图片,过渡
  • 原文地址:https://www.cnblogs.com/zoujinhua/p/11598574.html
Copyright © 2011-2022 走看看