加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

16-Oracle入门之数据库事务

发布时间:2020-12-12 15:28:29 所属栏目:百科 来源:网络整理
导读:基本概念 数据库事务由以下的部分组成: 一个或多个DML 语句 一个 DDL语句 一个 DCL语句 以第一个 DML 语句的执行作为开始:oracle默认事务似是打开的,但是不自动提交 ,mysql自动提交 。 以下面的其中之一作为结束: 提交: 显示结束: commit 隐式结束(自动提
INSERT 插入 UPDATE 更新 DELETE 删除 COMMIT 提交 SAVEPOINT 保存点 ROLLBACK 回滚

数据库的隔离级别

  • 对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:

    • 脏读: 对于两个事物 T1,T2,T1 读取了已经被 T2 更新但还没有被提交的字段. 之后,若 T2 回滚,T1读取的内容就是临时且无效的.
    • 不可重复读: 对于两个事物 T1,T1 读取了一个字段,然后 T2 更新了该字段. 之后,T1再次读取同一个字段,值就不同了.
    • 幻读: 对于两个事物 T1,T1 从一个表中读取了一个字段,然后 T2 在该表中插入了一些新的行. 之后,如果 T1 再次读取同一个表,就会多出几行.
  • 数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题.

  • 一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱

  • 数据库提供的 4 种事务隔离级别:sql99

  • Oracle 支持的 2 种事务隔离级别:READ COMMITED,SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED
    实际上还有一种是readonly,所以Oracle支持的隔离级别应该是3种!数据库几乎不做串行化操作,增加了read only。

  • Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

基本概念


  • 数据库事务由以下的部分组成:

  • 一个或多个DML 语句
  • 一个 DDL语句
  • 一个 DCL语句
  • 以第一个 DML 语句的执行作为开始:oracle默认事务似是打开的,但是不自动提交 ,mysql自动提交 。

  • 以下面的其中之一作为结束:

    • 提交:
      • 显示结束: commit
      • 隐式结束(自动提交): DDL语言,DCL语言,exit(事务正常退出)
    • 回滚:
      • 显示:rollback
      • 隐式 (系统异常终止): 关闭窗口,死机,掉电
  • 特点 要么都成功,要么都失败

  • 特性 原子性 一致性 隔离性 持久性

    事物的隔离性 多个客户端同时操作数据库的时,要隔离他们的操作
    否则:脏读 不可重复读 幻读
    设置不同的隔离级别来解决

  • COMMIT和ROLLBACK语句的优点

    1. 确保数据完整性。
    2. 数据改变被提交之前预览。
    3. 将逻辑上相关的操作分组。

    控制事务

    回滚到保留点

    • 使用 SAVEPOINT 语句在当前事务中创建保存点。
    • 使用 ROLLBACK TO SAVEPOINT 语句回滚到创建的保存点。
    UPDATE... SAVEPOINT update_done;
    Savepoint created. INSERT... ROLLBACK TO update_done;
    Rollback complete. 

    事务进程

    • 自动提交在以下情况中执行:

      • DDL 语句。
      • DCL 语句。
      • 不使用 COMMIT 或 ROLLBACK 语句提交或回滚,正常结束会话exit。
    • 会话异常结束或系统异常会导致自动回滚。

    提交或回滚前的数据状态

    • 改变前的数据状态是可以恢复的
    • 执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正
    • 其他用户不能看到当前用户所做的改变,直到当前用户结束事务。
    • DML语句所涉及到的行被锁定, 其他用户不能操作。

    数据的改变已经被保存到数据库中。

    • 改变前的数据已经丢失。
    • 所有用户可以看到结果。
    • 锁被释放, 其他用户可以操作涉及到的数据。
    • 所有保存点被释放。

    提交数据

    • 改变数据
    DELETE FROM employees WHERE employee_id = 99999;
    1 row deleted.
    
    INSERT INTO departments VALUES (290,'Corporate Tax',NULL,1700);
    1 row inserted.
    • 提交改变
    COMMIT;
    Commit complete. 

    数据回滚后的状态

    使用 ROLLBACK 语句可使数据变化失效:
    * 数据改变被取消。
    * 修改前的数据状态被恢复。
    * 锁被释放。

    DELETE FROM copy_emp;
    22 rows deleted.
    ROLLBACK;
    Rollback complete. 
    create table testsavepoint (tid number,tname varchar2(20));
    set feedback on insert into testsavepoint values(1,'tom1');
    insert into testsavepoint values(2,'tom2');
    savepoint a; //创建一个保存点
    insert into testsavepoint values(3,'tom3a); rollback to savepoint a;

    注意: 回退到savepoint a 前面插入的两条sql语句还没有提交; 仍然还在一个事务里面;让事务结束的方法:commit,rollback以及使用DDL语句和其他形式的退出:
    SQL> rollback / commit

    语句 功能
      推荐文章
        热点阅读