Oracle基础 事务

时间:2022-09-20 00:26:42

一、事务

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

二、事务的特性:

  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基础:数据库操作&lowbar;数据库事务&lowbar;表的锁定

    数据库操作语句: 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&vert; 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. Entity Framework 6 Recipes 2nd Edition(13-4)译 -&gt&semi; 有效地创建一个搜索查询

    问题 你想用LINQ写一个搜索查询,能被转换成更有效率的SQL.另外,你想用EF的CodeFirst方式实现. 解决方案 假设你有如下Figure 13-6所示的模型 Figure 13-6. A s ...

  2. iOS推送小结(证书的生成、客户端的开发、服务端的开发)

    1.推送过程简介 1.1.App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请 ...

  3. 快速入门系列--MVC--05行为

    Action执行包含内容比较多,主要有同步/异步Action的概念和执行过程,Authorationfilter, ActionFiltor, ResultFilter, ExceptionFilte ...

  4. java bean 转换工具

    考量要素: 1.简单的约定优于配置的同名属性copy 2.嵌套属性copy 3.flattern(扁平化)支持,要支持N层结构的copy到一层结构. 4.性能 如下这个网页,里面提到了好多工具. ht ...

  5. django中自定义标签和过滤器

    想要实现自定义标签和过滤器需要进行准备工作: 准备(必需)工作: 1  在某个app下创建一个名为templatetags(必需,且包名不可变)的包.假设我们在名为polls的app下创建了一个tem ...

  6. FAQ&colon;Python 断点调试

    Python程序调试:断点调试是必须有的功能,以Pycharm开发工具为例: 一.理论知识: 1. step into(F7)就是单步执行,遇到子函数就进入并且继续单步执行: 2  step over ...

  7. &lbrack;置顶&rsqb;&NewLine; bootstrap自定义样式-bootstrap侧边导航栏的实现

    前言 bootstrap自带的响应式导航栏是向下滑动的,有时满足不了个性化的需求,需要做一个类似于android drawerLayout 侧滑的菜单,这就是我要实现的bootstrap自定义侧滑菜单 ...

  8. Centos6安装和配置etcd3

    etcd 是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现.etcd 的灵感来自于 ZooKeeper 和 Doozer,侧重于: 简单:支持 curl 方式的用户 API ( ...

  9. Vue解决同一页面跳转页面不更新

    问题分析:路由之间的切换,其实就是组件之间的切换,不是真正的页面切换.这也会导致一个问题,就是引用相同组件的时候,会导致该组件无法更新. 方案一:使用 watch 进行监听 watch: { /* = ...

  10. OpenGLES渲染

    OpenGLES渲染 OpenGLES使用GPU渲染图片,不占用CPU,但其使用还是挺复杂的. 先用OpenGLES显示一张图片: // // ShowViewController.m // Open ...