一、事务

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

二、事务的特性:

  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. HDU2819Swap(二分图最大匹配)

    题目链接  http://acm.hdu.edu.cn/showproblem.php?pid=2819 题目大意很明确,交换图的某些行或者是某些列(可以都换),使得这个N*N的图对角线上全部都是1. ...

  2. iOS多线程总结

    1.不要同时开太多的线程(1~3条线程即可,不要超过5条) 2.线程概念 1> 主线程 : UI线程,显示.刷新UI界面,处理UI控件的事件 2> 子线程 : 后台线程,异步线程 3.不要 ...

  3. 关于mysql存储过程的definer的问题

    由于对mysql了解不够透彻,导致对definer问题查了好久才解决问题 记录自己的一些理解! 问题描述: 在数据库写,为一个表写了一个触发器,此触发器调用一个存储过程:由公司写的一个c程序自动往该表 ...

  4. 给js function的参数设置默认值

    C# 中 function func(a,b=1){//具体方法} js 中 function func(a,b){ a= arguments[0] || 10; b= arguments[1] || ...

  5. 同时使用Binding&StringFormat 显示Text【项目】

    Case ID (?unit) 红色的字根据一个后台boolean来做trigger,可以是Case or Open 蓝色的字binding到后台的一个string属性来切换任意的Unit单位 这样一 ...

  6. Js弹出层,弹出框代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Swift学习笔记十

    枚举 一个枚举为一组相关联的值定义一个通用类型,并且让你可以在代码中类型安全地操作这些值. C中的枚举将关联的名字指派给一系列整型值.Swift中的枚举类型更为活泼,并不需要为每个成员指定值,如果指定 ...

  8. SQL Server-删除表中重复的记录!

    比如现在有一人员表  (表名:peosons)若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来 select   p1.*   from   persons   p1,persons   p ...

  9. UVALive 4192 Close Enough Computations 水题

    Close Enough Computations 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge& ...

  10. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线

    D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...