zoukankan      html  css  js  c++  java
  • 【Oracle11g】15_事务

    1.什么是事务?

    事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作。这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。
    事务是一个不可分割的工作逻辑单元。

    例如:银行转账过程就是一个事务。它需要两条UPDATE语句来完成,这两条语句是一个整体,如果其中任一条出现错误,则整个转账业务也应取消,两个账户中的余额应恢复到原来的数据。

    2.事务的特性(ACID)

    2.1 原子性

    原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行。

    2.2 一致性

    一致性(Consistency):当事务完成时,数据必须处于一致状态
    案例说明

    -- 建表
    create table student(sno number,sname varchar2(100),sage number);
    insert into student values(1,'Mike',11);
    insert into student values(2,'John',22);
    insert into student values(3,'Tom',33);
    insert into student values(4,'Logan',44);
    commit;
    

    在窗口1中进行数据的更新,然后新打开窗口2,查询出来的数据为更新后的数据,这个例子就说明了数据库的一致性。

    一致性读
    例如:现在表student非常的大,执行select * from student where sno=4 这条记录需要半小时,那么假如10:00我执行这条命令,我在等待数据执行的时候,10:20另外一个用户执行了update student set sage=66 where sno=4;commit; 到10:30的时候第一条select 语句才返回查询结果,那么返回的记录中sage是修改前的还是修改后的呢?
    答案是:修改前的,undo段里保留了修改前的数据

    2.3 隔离性

    隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务

    我们先在窗口1中修改sno=4的记录,不提交的情况下,在窗口2中修改sno=4的记录,此时我们会发现,在窗口2中被hang住了。当我们在窗口1中执行commit的时候,窗口2也会自动执行update

    2.4 永久性

    永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性

    永久性表示数据一旦被更新提交后,就会永久保存在数据库中,直到下次更新。

    3.事务的命令

    Oracle11g中的事务相关的命令:commit savepoint rollback
    Sql*plus中,设置是否自动提交:set autocommit on|off

    3.1 savepoint案例演示

    
    SQL> create table cust_info(id number,name varchar2(10));
    
    表已创建。
    
    SQL> insert into cust_info values(1,'aa');
    
    已创建 1 行。
    
    SQL> savepoint mark1;
    
    保存点已创建。
    
    SQL> update cust_info set name='bb';
    
    已更新 1 行。
    
    SQL> savepoint mark2;
    
    保存点已创建。
    
    SQL> delete from cust_info;
    
    已删除 1 行。
    
    SQL> savepoint mark3;
    
    保存点已创建。
    
    SQL> insert into cust_info values(1,'cc');
    
    已创建 1 行。
    
    SQL> select * from cust_info;
    
            ID NAME
    ---------- ----------
             1 cc
    
    SQL> rollback to savepoint mark2;
    
    回退已完成。
    
    SQL> select * from cust_info;
    
            ID NAME
    ---------- ----------
             1 bb
    
    SQL>  rollback to savepoint mark3;
     rollback to savepoint mark3
    *
    第 1 行出现错误:
    ORA-01086: 从未在此会话中创建保存点 'MARK3' 或者该保存点无效
    

    上述案例中,从上往下依次设立了mark1、mark2、mark3三个事务点,但是如果回退到mark2,则再想回退到mrak3,是无法回退的。

  • 相关阅读:
    MySQL性能优化的最佳经验
    18个网站SEO建议
    sql之left join、right join、inner join的区别
    PHP与MYSQL事务处理
    Firefox上Web开发工具库一览
    SphinxSE的安装
    python XML
    python yaml
    C语言文本处理
    Linux strace命令
  • 原文地址:https://www.cnblogs.com/OliverQin/p/12716309.html
Copyright © 2011-2022 走看看