zoukankan      html  css  js  c++  java
  • 玩转Spring事务(一)

    1.事务就是不成功便成仁的节奏

    简单来说事务是由一系列要不都成功要不都失败的操作组成的,举个简单例子:小明进行转账处理

    可以预见的是系统处理步骤是:

    1.修改小明的账户余额:减少100;

    2.修改对方的账户余额:增加100;

    这时候如果在处理步骤2时,系统异常了,没有正常增加100,那么对么小明账户的操作也应该是无效的.


    2.没有事务的世界

    1.创建一个账户表:

    create table T_ACCOUNT
    (
      code    VARCHAR2(100) not null,
      balance NUMBER,
      owner   VARCHAR2(100)
    )

    2.创建两个账号:

    insert into t_account(code,balance,owner) values ('001',100,'小明');
    insert into t_account(code,balance,owner) values ('002',100,'小张');

    现在 我们有两个账号了,
    现在进行转账操作:

    update t_account t  set t.balance = t.balance -100 where t.owner='小明';
    commit;
    update t_account t  set t.balance = t.balance +100 where t.owner='小张 ';
    commit;

    将小明的账号减100,小张的账号加100

    看下对不对

    select t.* from t_account t

    结果如下:

    擦!小明的账号是减少了100,可小张的还是100,好吧,这里设了个小坑,故意把小张的名字后加了一个空格,这样的话肯定就不会对小张的账户进行更新了,但是由于进行了commit,所以小明的账户余额被莫名其妙地减少了100


    3.与事务的初级见面

    在SQL里输入以下代码:

    declare
     vCount number;
    begin
      select count(*) into vCount from t_account t where t.code='小明';
      if vCount = 0 then 
        raise no_data_found;
       end if; 
      update t_account t  set t.balance = t.balance -100 where t.owner='小明';
      select count(*) into vCount from t_account t where t.code='小张 ';
        if vCount = 0 then 
        raise no_data_found;
       end if; 
      update t_account t  set t.balance = t.balance +100 where t.owner='小张 ';
      commit; 
    exception
      when no_data_found then
        dbms_output.put_line('找不到对应账户');
        rollback;
    end;

    运行后查看结果,发现账户余额一切正常,但报错信息如期而至.

    这里的关键词commit和rollback,如果一切正常最后程序进行了commit,如果没有找到账户,则会进行rollback,rollback的效果就是小明和小张的账户余额都是"回滚"到处理之前的状态;

    4.原来事务管理就是commit和rollback的组合啊

    如果你面对的数据是存放在数据库中的,那么事务对你来说就是各种commit和rollback的组合.


    5.事务的特性ACID

    ACID:

    A是Atomicity的简写,原子性,是数据库能够进行操作的最小的逻辑单元,证明他包含的所有操作都是不可分割的。

    C是Consistency的简写,一致性,就是他们要么同时全部成功,要么同时全部失败。成功与失败的操作保持一致

    I是Isolation的简写,隔离性,指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到;

    D是Durability的简写,持久性,当系统或介质发生故障时,确保已提交事务的更新不能丢失;



  • 相关阅读:
    系统架构设计师软考总结
    统一用户认证系统CUAS实现要点
    Activiti使用总结
    性能优化总结篇
    CVE-2016-5734-phpmyadmin-4.0.x-4.6.2-代码执行
    WooYun-2016-199433 -phpmyadmin-反序列化-getshell
    CVE-2015-1635-HTTP.SYS远程执行代码
    泛微OA 多版本存在命令执行
    CVE-2019-20372-Nginx error_page 请求走私
    通达OA 页面敏感信息-2013/2015版本
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3134674.html
Copyright © 2011-2022 走看看