一,oracle的事务:

是指对数据操作的一系列动作的统称.即:事务的任务便是使数据库从一种状态变换成为另一种状态,这不同于文件系统,它是数据库所特用的。

事务有四大特性(ACID):

1,原子性(atomicity),

事务中的所有任务要么全部成功,要么全部失败.不能存在部分成功,部分失败.

比如银行转账,A向B转200元,A账户余额少200元,B账户余额多200元.不能出现A账户少200元而B账户余额没多出200元.

2,一致性(consistency),

  事务将数据库从一种一致状态转变为下一个一致状态.

比如转账,A账户和B账户都成功的更新了余额,则这个转账操作才是成功完成的,如果任何一个操作发生而另一个没有发生,

就会导致数据出现不一致,而使用事务可以确保数据的一致性.

  

3,隔离性(isolation),

  一个事务的影响在该事务提交到数据库前对其他事务都是不可见得.

比如转账,当将A账户的余额减少时,由于还没有更新B账户,事务没提交,其他用户在查看A账户时,

不会看到A账户余额已经减少,只有在转账成功完成时,才会看到效果,这使得事务好像是串行执行的一样

4,持久性(durability),

  事务一旦提交,其所做的更改就是永久性的.

数据库通过其恢复机制,确保在事务中所作的更改不会丢失.

事务结束的几种情况:

1,遇到commit,rollback语句时,提交或者回滚事务.

2,当用户退出Oracle工具时,

3,当机器失效或者是系统崩溃时.

二,事务的管理

commit,提交自上一次commit或者是rollback一来,所有当前的改变,并且释放所有的锁

rollback,回滚自上一次commit或者是rollback一来,所有当前的改变,并且释放所有的锁

rollback to savepoint ,回滚改变到一个已经保存的保存点,并且释放所有该范围内的锁

savepoint,建立一个保存点,允许完成部分回滚操作

set transaction,允许开始一个只读或者读写回话,建立一个隔离级别,或者将当前的事务赋给一个特定的回滚段

lock table,允许使用特定的模式锁定整个数据库表,这将覆盖默认行级别的锁定,

使用commit提交事务:

oracle的事务和sql sever 有着很大的区别,在sql server中,如果用户执行了一条Insert语句,sql server会自动的开始一个事务然后提交,或者是执行begain tranction 来显示的开启一个语句块事务,但是Oracle 的事务是隐式的,也就是说自上次提交或者回滚以来的任何对数据库的操作都会导致有个新的事务开始.除非用户显式的使用commit或者是rollback提交或者回滚事务,则对数据库的修改只会保存在当前会话的撤销段中,并不会对数据库造成永久性的更改.

当一个事务开始时,Oracle会为这个事务分配一个可用的UNDO字段,也就是撤销字段,用来记录新的事务的更改,当第一个DML(insert,update,delete)语句执行时,Oracle除了分配撤销字段外,还会分配事务表槽和事务ID,事务ID对于整个事务来说是唯一的.

在sqlplus中执行一条update语句:

update emp e e.sal=8000 where e.empno=7336;

接着执行一条sql:

select XID as '事务ID',XIDUSN as 'UNDO' ,XIDSLOT as '事务槽', XIDSQN as 'seq', STATUS as '事务状态' from v$transaction

当用户开启一个事务时,可以看到一个具体的事务ID,并且分配了指定的UNDO段和事务槽,当前事务的状态是激活状态,v$transaction动态的数据字典视图,当事务被提交或者是回滚后,位于该视图基表中的事务信息会被自动删除.

当一个事务需要更改持久化到数据库中时,可以使用Oracle提供的Commit,

当使用Commit时,其实是起到了两个作用:

1,对DML语句进行更改,会被持久到数据库中,其他用户也可以查询的到

2,释放作用于表或行上的所有锁,同时清除自上一次提交或回滚以后的所有的保存点

Commit的语法如下:

commit [work] [comment text];

关键字work 是为了增加可读性,其实是没啥作用的.

comment是用来添加注释的.comment的text(文本内容)长度不要超过50个字符.

比如:commit comment '提交数据,保证数据的正确性';

当一个事务产生时,Oracle除在UNDO段中产生撤销记录外,还会在重做日志缓冲区中产生REDO记录,REDO记录用于重放事务,以便于在出现数据故障或者需要回复数据库时对数据所做的修改,并且会修改SGA的数据库缓冲区,在提交事务时,实际会做3件事:

1,在重做日志记录中,所修改的表被标记上所提交事务的唯一系统更改号SCN

2,LGWR日志写进程将事务的未写入磁盘的REDO信息及事务的SCN从重做日志缓冲区写到磁盘上的重做日志文件,完成提交

3,释放DML操作所分配的锁,Oracle标记事务完成.

注意:

提交数据只是将重做日志缓冲区中的信息刷新输出到磁盘,并不是将数据库高数缓存中已经修改的快立即写入到磁盘中,因此,commit语句通常执行的比较快,即便是做了较大的修改,commit语句也往往会立即执行完成.

使用rollback回滚事务:

如果要撤销事务中对数据库的操作,可以使用bollback语句,该语句会撤销自事务开始以来sql语句所作的更改.

语法如下:

rollback [work][TO [savepoint] savepoint_name];

rollback 回滚语句与commit不一样,commit在提交时,commit在提交数据时,数据库只会将重做日志缓冲区的数据写入到联机重做日志文件,并不会立即将缓冲区高速缓存中的数据块写入到磁盘,而rollback需要物理的将UNDO表空间中的撤销记录进行回滚,回滚是个物理操作,他需要逆向的执行在UNDO段中写入的数据,并且释放所有的锁,对于一个较大的事务来说,回滚的开销会很大,一般很少对一个大的事务进行回滚,除非操作错误,或者sql出错.

使用savepoint保存点:

保存点实际会完成三个工作:

1,从保存点以后所做的所有操作都被撤销,并且rollback之后的保存点也会被清除,但是当前的保存点未被释放,如果需要,可以再次撤销该保存点

2,自该保存点以后sql语句所需的锁和资源都会被释放

3,虽然撤销到保存点,但是并不是结束整个事务,sql会处于挂起状态.

事务的隔离级别:

保证一个事务在提交前其他事务看不到相应事务所做的操作

使用SET TRANSACTION 设置事务的属性:

语法如下:

set trancaction parameter

read only :只读,此事务中执行任何Insert ,delete,uodate语句都属于是非法 操作,对于这些事务不需要回滚

read write 读写事务,这是Oracle默认的设置.

isolation level :用来设置事务的隔离级别,即规定在事务中如何处理DML事务,可以设置Serializable和READ committed,这两个选项

SERIAIZABLE 选项会使得对已经修改但是还没提交的数据对象的DML事务失败,

READ Committed 是对已经修改但没有提交的数据库对象的DML事务进行修改时,会等待前面的DML锁消失,这是Oracle的默认特性,ISOLOATION level 的基本操作语法如下:

SET TRANSACTION ISOLATION level serializable--设置序列隔离级别

SET TRANSACTION  ISOLATION  READ committed--设置读提交隔离级别

注意:

由于SET TRANSACTION  必须是事务中的第一条语句,因此实例先使用Rollback 回滚事务,然后调用update 语句,可以见到Pracle 抛出错误,表示不能在一个只读事务上进行DML操作,但是可以查询.

在默认情况下,事务是可读可写的,是因为隔离级别默认是READ WRITE ,所以才可以进行DML操作.

如果设置为SET TRANSACTION ISOLATION level serializable,两个sql窗口都执行update语句,第二个窗口会被锁着,如果窗口1commit后,2窗口仍然会报错.

Oracle之事务的更多相关文章

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

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

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

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

  3. [转]了解oracle自治事务

    http://blog.csdn.net/indexman/article/details/7799862 1.什么是Oracle自治事务 在官方文档中,是这样的定义的“Autonomous tran ...

  4. 浅述Oracle分布式事务概念

    着系统的复杂性不断增加,我们所面对的分布式系统渐渐增加.分布式文件系统.分布式消息队列系统等等层出不穷,在一些行业特别是互联网行业应用广泛.分布式数据库也是目前使用比较常用的分布式系统之一. 简单来说 ...

  5. Oracle - 数据更新 - 事务

    /* 事务 事务是为了控制数据异步访问所使用的一种技术 就类似于java中的锁机制 synchronized,只不过功能更加强大 事务不能进行嵌套,当我们开启一个事务的之后作的每一次dml语句都属于这 ...

  6. oracle之事务和锁

    Oracle的事务和锁(PPT-I-283-293) 10.1 什么是事务 必须具备以下四个属性,简称ACID 属性:原子性(Atomicity):  事务是一个完整的操作.事务的各步操作是不可分的( ...

  7. oracle分布式事务总结-转载

    基本概念 Local Coordinator:在分布事务中,必须参考其它节点上的数据才能完成自己这部分操作的站点. Global Coordinator:分布事务的发起者,负责协调这个分布事务. Co ...

  8. Oracle基础 事务

    一.事务 事务就是业务上的一个逻辑单元,它能够保证其中对数据所有的操作,要么全部成功,要么全部失败. 二.事务的特性: 1.原子性:事务是SQL中的最小执行单位,不能再进行分割.要么全部执行,要么全部 ...

  9. Oracle 临时事务表 全局临时表_global temporary table

    所有的操作都在一个事务里,事务提交后,此表清空,特别适合做插入删除频率特别高的临时表操作,比如插入完数据就开始查询,查询完就删掉等,用完就扔! 临时表分事务级临时表和会话级临时表. 事务级临时表只对当 ...

随机推荐

  1. 几种常用的Java数据源解决方案

    http://blog.163.com/qqabc20082006@126/blog/static/22928525201041944847653/

  2. Centos 5.5下安装samba

    1.安装: Centos 5.5下安装samba,具体步骤如下: [root@bogon ~]# rpm -q samba Package samba is not installed [root@b ...

  3. linux定时执行任务 转

    转自:http://www.cnblogs.com/thinksasa/archive/2013/06/06/3121030.html linux定时执行任务   (1)Linux下如何定时执行php ...

  4. Java反射 - 1(得到类对象的几种方法,调用方法,得到包下的所有类)

    通过反射获得对象的方法 准备工作: 有一个User类如下 package o1; /** * Created by yesiming on 16-11-19. */ public class User ...

  5. android JNI (二) 第一个 android工程

    下载NDK 后 它自带有 sample,初学者 可以导入Eclipse 运行 这里 我是自己创建的一个新工程 第一步: 新建一个Android工程 jni_test(名字自取) 第二步:为工程添加 本 ...

  6. Selenium2+Python自动化测试实战

    本人在网上查找了很多做自动化的教程和实例,偶然的一个机会接触到了selenium,觉得非常好用.后来就在网上查阅各种selenium的教程,但是网上的东西真的是太多了,以至于很多东西参考完后无法系统的 ...

  7. 怎么用visual studio2010编写c++程序

    如何通过visual studio 2010编写一个简单的c++程序,随小编不一起看看如何编写. 首先打开visual studio 2010 点击软件左上角“文件-新建-项目”,选择“win32-w ...

  8. 图的建立——邻接表表示(C语言+VC6.0平台)

    图是一种重要而且相对复杂的数据结构,在实际编程中非常有用.邻接表是图的主要表示形式之一,是一种链接表表示方法. #include<stdio.h> #include<stdlib.h ...

  9. C#的Reflection总结

    什么是反射 在.NET中的反射也可以实现从对象的外部来了解对象(或程序集)内部结构的功能,哪怕你不知道这个对象(或程序集)是个什么东西,另外.NET中的反射还可以运态创建出对象并执行它其中的方法. 反 ...

  10. 为什么设计模式在C++社区没有Java社区流行?

    我们发现设计模式在Java社区很流行,但是在C++社区却没有那么被关注,甚至有点被排斥,究竟是什么原因造成这个差异的呢?    昨天和同事讨论这个问题,最后得出几点原因:     (1)C++内存需要 ...