一、事务

  事务就是业务上的一个逻辑单元,它能够保证其中对数据所有的操作,要么全部成功,要么全部失败。

二、事务的特性:

  1、原子性:事务是SQL中的最小执行单位,不能再进行分割。要么全部执行,要么全部不执行

  2、一致性:在事务操作前和事务操作后,数据必须处于一致状态。

  3、隔离性:事务之间是相互隔离的,多个事务不会相互影响。

  4、持久性:当事务提交后,数据则永久有效。

  读取事务异常:

  1、脏读:一个事务读取了另一个事务未提交的数据。

  2、不可重复读:一个事务再次读取之前曾经读取过的数据时,发现该数据已经被另一个已提交的事务修改。

  3、幻读:一个事务根据相同的查询条件,重新执行查询,返回记录中包含了与前一次执行查询返回的记录不同的行。

  事务的隔离级别:

  ANSI SQL-92标准中定义的事务级别:

  1、Read Uncommitted:最低等级的事务隔离,它仅仅保证了读取过程中不会取到非法数据。

  2、Read Comitted:此级别的事务隔离保证了一个事务不会读到另一个并行事务已修改但未提交的数据,此级别的事务级别避免了”脏读“。

  3、Repeatable Read:此级别的事务隔离避免了”脏读“和”不可重复读“异常现象的出现。一个事务不可能更新已经由另一个事务读取但未提交(回滚)的数据。

  4、Serializable:最高等级的隔离级别,提供了最高等级的隔离机制,三种异常情况都能避免。该事务以串行执行的方式执行。

  Oracle中提供的隔离级别:

  1、Read Comitted:Oracle默认的隔离级别,此级别的事务保证了一个事务不会读到另一个并行事务已修改但未提交的数据,也就是说,此等级的事务避免了"脏读"。

  2、Serializable:最高等级的隔离级别,提供了最高等级的隔离机制,三种异常情况都能避免。

  3、Read Only:Read Only是Serializable的子集,指事务中不能有任何修改数据库中数据的语句(DML),以及修改数据结构的语句(DDL)。只允许读不允许改。

三、事务控制语句:

  1、COMMIT:提交事务,对数据库的修改进行保存。

  2、ROLLBACK:回滚事务,取消对数据库所做的修改。

  3、SAVEPOINT:在事务中创建存储点。

  4、ROLLBACK TO <SAVEPOINT>:将事务回滚到存储点。

  5、SET TRANSACTION:设置事务的属性。

四、使用事务的步骤:

  1、开启事务。在Oracle中,事务是在上一次事务结束以后,数据“第一次”被修改时自动开启。

  2、进行(多次)数据操作(增、删、改)。

  3、结束事务:事务结束有两种情况.

    (1)事务被提交:

      a.发出COMMIT命令。

      b.执行DDL语句。如果DDL语句前面有DML语句,则Oracle会自动把前面的DML语句作为一个事务提交。

      c.与Oracle断开连接,或退出PL/SQL Developer,事务会自动提交。

    (2)数据被撤销:

      a.发出ROOLBACK命令.

      b.服务器进程异常结束。

      c.DBA停止会话。

  例:模拟银行转账:

--创建测试表,建立金额检查约束,必须大于0
CREATE TABLE ACCOUNT
(
userid NUMBER CONSTRAINT pk_bid PRIMARY KEY,
username VARCHAR2(20) NOT NULL,
balance NUMBER(16,2) NOT NULL CONSTRAINT ck_balance CHECK(balance > 0)
) --插入测试数据
INSERT INTO ACCOUNT VALUES(1,'张三',3000);
INSERT INTO ACCOUNT VALUES(2,'李四',1);
--银行转账事务
BEGIN
UPDATE ACCOUNT SET balance = balance - 2000 WHERE userid = 1;
UPDATE ACCOUNT SET balance = balance + 2000 WHERE userid = 2;
COMMIT;
EXCEPTION
WHEN OTHERS THEN ROLLBACK;
END;

  例:操作dept表:  

INSERT INTO dept VALUES(50,'a',NULL);      --插入两条记录
INSERT INTO dept VALUES(60,'b',NULL);
SAVEPOINT a; --设置保存点
INSERT INTO dept VALUES(70,'c',NULL); --插入新的数据
ROLLBACK TO SAVEPOINT a; --回到保存点a,则保存点后的SQL语句失效。
select * FROM dept; --插入c的值没有了。
ROLLBACK; --回滚事务,插入的a和b的值也没有了。
SELECT * FROM dept;

  总结:

  ⑴事务用于确保数据的一致性,由一组相关的DML语句组成,要么全部不执行,要么全部撤销。

  ⑵当执行事务操作时,Oracle会自动在作用的表上加锁,以防止其他用户锁定该表,同时也在行上加行级锁,以防止其它事务在相应行上执行DML操作。

  ⑶当执行事务提交或者回滚时,Oracle会确认事务变化或回滚事务、结束事务、删除保存点,释放锁。

  ⑷事务期间应避免与使用者交互。

  ⑸尽可能让事务持续时间越短越好。

  ⑹在事务中尽可能存取最少的数据量。

五、SET TRANSACTION

  可以用来设置事务的属性,但是必须放在事务的第一条。可以设置3个属性。

  1、设置事务的隔离级别。

  1)SET TRANSACTION READ ONLY

  2)SET TRANSACTION ISOLATION LEVEL READ COMMITTED

  3)SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

  2、规定回滚事务时所使用的存储空间。

  3、对事务命名。

  SET TRANSACTION NAME 'tname';

Oracle基础 事务的更多相关文章

  1. Oracle基础:数据库操作_数据库事务_表的锁定

    数据库操作语句: INSERT INTO 表名[(字段列表)] VALUES ( 表达式列表); 例子:INSERT INTO emp(empno,ename,job,hiredate) VALUES ...

  2. 数据库事务隔离级ORACLE数据库事务隔离级别介绍

    本文系转载,原文地址:http://singo107.iteye.com/blog/1175084 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committ ...

  3. 图说Oracle基础知识(一)

    本文主要对Oralce数据库操作的基础知识进行一下梳理,以便进行归纳总结.适用于未使用过Oracle数据库的读者,或需要学习Oracle数据库方面的基础知识.如有不足之处,还请指正. 关于SQL介绍的 ...

  4. Oracle基础了解

    数据库: 关系型数据库 select * from 表名 非关系型数据库(做不到复杂查询) 以对象的形式进行存储 {"aaa":"ccc"}---键值对 ora ...

  5. Oracle基础学习笔记

    Oracle基础学习笔记 最近找到一份实习工作,有点头疼的是,有阶段性考核,这...,实际想想看,大学期间只学过数据库原理,并没有针对某一数据库管理系统而系统的学习,这正好是一个机会,于是乎用了三天时 ...

  6. ORACLE| ORACLE基础语法汇总

    创 ORACLE| ORACLE基础语法汇总 2018-07-18 16:47:34 YvesHe 阅读数 9141更多 分类专栏: [数据库]   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

  7. Oracle打怪升级之路一【Oracle基础、Oracle查询】

    前言 背景:2021年马上结束了,在年尾由于工作原因接触到一个政府单位比较传统型的项目,数据库用的是Oracle.需要做的事情其实很简单,首先从大约2000多张表中将表结构及数据导入一个共享库中,其次 ...

  8. Oracle一个事务中的Insert和Update执行顺序

    今天碰到了一个奇怪的问题,是关于Oracle一个事务中的Insert和Update语句的执行顺序的问题. 首先详细说明下整个过程: 有三张表:A,B,C,Java代码中有一段代码是先在表A中插入一条数 ...

  9. oracle基础教程(8)oracle修改字符集

    oracle基础教程(8)oracle修改字符集 1.用dba连接数据库 -->sqlplus / as sysdba 2.查看字符集 -->SELECT parameter, value ...

随机推荐

  1. Android中使用gzip传递数据

    HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来减少文件大小,减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时 ...

  2. iOS Ping++前端集成支付

    直接上代码 /* 获取订单charge 1.buyerId  买家ID 2.sellerId  卖家ID 3.liveId    直播间ID 4.goodCount 商品数量 5.status    ...

  3. js 控制DIV 预览打印

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> ...

  4. preventDefault stopPropagation??

    棒棒哒~ event.preventDefault https://developer.mozilla.org/zh-CN/docs/Web/API/Event/preventDefault stop ...

  5. 9.依赖(Dependence)

    依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系.可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的. ...

  6. 不间断图片滚动JS

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期 2014-05-07) MSClass是一款通用不间断滚动JS封装类,几乎支持目前所有流行风格的图片或文字滚动,横向/竖向/连续/间断 ...

  7. js ajax上传图片到服务器

    $("#up_goods_pic").on('change',function(){ var file = this.files[0]; var url = webkitURL.c ...

  8. 深入理解DLL文件

    1.LIB与DLL文件的区别 DLL是一个完整的程序,称为“动态链接库”,DLL中包含的主要有三块内容:1.全部变量 2.函数接口 3.资源:DLL中有一个函数导出表,其中每一项都是一个函数名称.通过 ...

  9. com.sun.image.codec.jpeg--导入报错

    import com.sun.image.codec.jpeg; 这样导入的时候,总是报错:Only a type can be imported. com.sun.image.codec.jpeg ...

  10. ZTE AD3812 3G模块在linux 2.6.34 内核的开发板上的支持方法

    先说段废话,话说在linux 2.6.34 下,好多比较新的3G网卡及3G模块都没有很好的支持.如果想支持的这些3G网卡/3G模块呢,基本上有两种方式: 1.使用该3G模块的 linux 下的驱动,交 ...