zoukankan      html  css  js  c++  java
  • sqlserver-事务处理

    事务的概念:简单说就访问并可能更新数据库中各种数据项的一个程序执行单元,一旦开启事务,所有对数据的操作要么全部执行,要么全部都不执行。单条sql语句本身就是一个事务.

    事务的属性

      事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有4个属性,称为原子性(Atomic)、 一致性(Consistent)、隔离性(Isolated)、持久性(Durable),简称ACID属性,只有这样才能构成一个事务。

      原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

      一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

      隔离性:两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。

      持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

    工作开发过程中对事务的依赖性很强,复杂一点的sql操作一般都离不开事务.

    举个很简单的例子,银行转账是简单可以分为两个步骤

    如:账号A向账号B转1000元钱。

    1、账号B+1000元;

    2、账号A-1000元;

    这两步是不可分的,假如账号B+1000元后,执行第二步发现账号A余额不足时(当然实际开发中会先判断余额,这里是假设),执行失败,那么账号B就多出了1000元,而账号A却没减去1000元。

    有了事务我们就可以保证这两步要么全部执行,要么全部不执行。

    伪代码:

    begin 事务

      update 账号表 set money=money+1000 where 账号=账号B;

      update 账号表 set money=money-1000 where 账号=账号A;

    if 程序报错

      rollback 事务;

    else

      commit 事务;

    --------------------------------------------------------------------------------------------------------------------------------

    sql代码

    1 create table tbl_test(
    2     id nvarchar(10),
    3     name nvarchar(5)
    4 );
    5 insert into tbl_test values('001','名字1');
    6 update tbl_test set name='名字2' where id='001'
    7 update tbl_test set name='名字超过5字' where id='001' --这句话会报错 将截断字符串或二进制数据。

    上面的代码最后执行完,会将名字1改为名字2

    加上事务

     1 begin transaction
     2 update tbl_test set name='名字2' where id='001';
     3 update tbl_test set name='名字超过5字' where id='001';
     4 if @@error <> 0
     5     begin
     6         rollback transaction
     7     end
     8 else
     9     begin
    10         commit transaction 
    11     end

    执行结果name字段的值还是名字1,第二句update执行失败了之后,第一句update也没有执行。

    另一种写法:T-sql是有异常机制的

     1 begin try
     2     begin transaction
     3         update tbl_test set name='名字2' where id='001';
     4         update tbl_test set name='名字超过5字' where id='001';
     5         commit transaction 
     6 end try
     7 begin catch
     8     --select ERROR_NUMBER() as 错误代码 
     9     rollback transaction 
    10 end catch
  • 相关阅读:
    做一天业务员的感觉:辛苦!
    我的乒乓生涯之三浑浑噩噩的中学六年
    名菊照片(二)
    今天,同事的裤子破了
    昨晚,再一次兵败滑铁卢
    今天去世纪公园看名菊展,拍了好多照片发上来大家一起欣赏:)
    寻找上海市乒友喜欢打乒乓的朋友都进来看看
    同学给我两张f1照片:)
    又搞到几张f1照片,发上来给大家养眼
    我的乒乓生涯之四乒乓姻缘
  • 原文地址:https://www.cnblogs.com/fnz0/p/5444929.html
Copyright © 2011-2022 走看看