oracle事务(转)

今天温习oracle事务,记录如下:

  1. 事务定义

           事务是保持数据的一致性,它由相关的DDL或者DML语句做为载体,这组语句执行的结果要么一起成功,要么一起失败。

我们知道SQL92标准定义了数据库事务的四个特点:

  • 原子性 (Atomicity) :一个事务里面所有包含的SQL语句是一个执行整体,不可分割,要么都做,要么都不做
  • 一致性 (Consistency) :事务开始时,数据库中的数据是一致的,事务结束时,数据库的数据也应该是一致的
  • 隔离性 (Isolation):   多个事务并发的独立运行,而不能互相干扰,一个事务修改,新增,删除数据在根据当前事务的事务隔离级别基础上,其余事务能看到相应的结果(这里为什么这么说,下面我会给我具体的例子进行分析)
  • 持久性 (Durability) : 事务被提交后,数据会被永久保存

2. 事务控制命令

  • COMMIT  提交事务
  • SAVEPOINT 事务保存点 (savepoint a)
  • ROLLBACK(TO) 回滚[回滚到定义的保存点] rollback to a

3. 锁的概念

    锁是为了保证多个并发的事务在引用同一个资源时,对资源的保护,同时也防止事物间的相互破坏。

4. Oracle中锁类型

  • 共享锁(表锁)共享锁有一下几种模式

    • 行共享模式  : 不运行其它用户插入,删除,更新操作,多个用户可以同时作用于该表,都能查询。语法如下:Lock table XX in share mode
    • 行共享更新模式 : 允许多个用户同时锁定表中不同的行,能执行DML语句,除了那些被锁定的行。
  • 排他锁(行锁):  不允许其它用户对该表插入,删除,修改操作,只能查询,同时其它用户不能修改和锁定表
  • 死锁 : 所个事务对资源的相互等待,造成死锁。

5. 事务隔离级别

事务隔离级别定义了事务之间的隔离程度。SQL92标准中定义了4中隔离级别。

  • 未提交读 (READ UNCOMMITTED) 幻想读、不可重复读和脏读都允许。
  • 提交读   (READ COMMITTED)   允许幻想读、不可重复读,不允许脏读。
  • 重复读 (REPEATABLE READ)    允许幻想读,不允许不可重复读和脏读。
  • 序列化 (SERILIZABLE)             幻想读、不可重复读和脏读都不允许。

通过一些现象,可以反映出设置事务隔离级别产生的效果:

  • 幻想读(幻读):  事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。
  • 脏读: 事务T1修改了一条数据,但是还未提交,事务T2恰好读取到了这条修改后了的数据,此时T1将事务回滚,这个时候T2读取到的数据就是脏数据,称为脏读。
  • 不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。

6.Oracle的事务隔离级别

ORACLE提供了SQL92标准中的read committed和serializable,同时提供了非SQL92标准的read-only。

  • READ COMMITTED 

    • 这是ORACLE缺省的事务隔离级别。
    • 事务中的每一条语句都遵从语句级的读一致性。
    • 保证不会脏读;但可能出现非重复读和幻像。
  • SERIALIZABLE
    • 简单地说,serializable就是使事务看起来象是一个接着一个地顺序地执行。
    • 仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改(也就是说其它事务在本事务开始后所做的修改,即使提交了,本事务也看不到)
    • 保证不会出现非重复读和幻像。
    • Serializable隔离级别提供了read-only事务所提供的读一致性(事务级的读一致性),同时又允许DML操作.
  •    设置隔离级别
    •     设置一个事务的隔离级别 

      • SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
      • SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
      • SET TRANSACTION READ ONLY;
    •     设置单个会话的隔离级别 
      • ALTER SESSION SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
      • ALTER SESSION SET TRANSACTION ISOLATION SERIALIZABLE;

  7.具体例子

    • 准备SQL
    • Sql代码  
      1. create table A(
      2. id int,
      3. name varchar2(50),
      4. primary key(id)
      5. );
    • 演示一个T1插入,T2读取数据
    • T1提交事务后,T2可以看到数据
    • 我们看到了事务隔离级别的效果,那么T1,T2事务执行时,oracle怎么设置这两个事务的锁的呢?我们来看一下这个操作
    • 当T1提交后,T2修改表A成功
  • 演示2个事务,T1更新表A的数据,T2删除表2的数据
    • 下面将T1提交,T2得到执行
    • T1提交后的情况
  • 演示事务的隔离级别
    • T1事务设置隔离级别为SERIALIZABLE,T2为默认级别
    • 有的朋友可能会问,是不是T2未提交造成的,那么我们将T2提交后的结果如下
    • 我们看看T3的查询结果
    • 由上述结果我们可以知道,如果事务设定了序列化的隔离级别,那么在该事务期间,其它事务对该事物中引用的资源修改将不可见。

      好了,今天的总结到此,还会有后续文章

http://kingj.iteye.com/blog/1675011#bc2358875

时间: 2024-07-28 19:29:40

oracle事务(转)的相关文章

oracle事务和锁

数据库事务概括 1. 说明 一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退. 2.事务相关概念 1)事务的提交和回滚:COMMIT/ROLLBACK 2)事务的开始和结束 开始事务:连接到数据库,执行DML.DCL.DDL语句 结束事务: 1. 执行DDL(例如CREATE TABLE),DCL(例如GRANT),系统自动执行COMMIT语句 2. 执行COMMIT/ROLLBACK 3. 退出/断开数据库的连接自动执行COMMIT语句 4. 进程意外终止,事务自动rollback 5

Oracle事务

Oracle事务的ACID特性 原子性Atomicity:事务中的所有动作要么都发生,要么都不发生. 一致性Consistency:事务将数据库从一种状态转变为下一种一致状态. 隔离性Isolation:一个事务的影响在该事务提交前对其他事务时不可见的. 持久性Durability:事务一旦提交,其影响就是永久性的. 事务控制语句 事务隐式开始 事务必须显示结束(Commit.Rollback) Commit 会结束事务,并使得已做的修改持久的保存在数据库中 Rollback 会结束事务,并撤销

Oracle 事务的開始与结束

事务是用来切割数据库活动的逻辑工作单元,事务即有起点,也有终点: 当下列事件之中的一个发生时,事务就開始了: 连接到数据库上,并运行了第一天 DML 语句: 当前一个事务结束后,又输入了另外一条 DML 语句: 当下列事件之中的一个发生时,事务就结束了: 运行 COMMIT 或 ROLLBACK语句: 运行一条 DLL语句,比如 CREATE TABLE 语句:在这样的情况下, 会自己主动运行 COMMIT 语句: 运行一条 DCL语句,比如GRANT语句:在这样的情况下,会自己主动运行COMM

Oracle 事务操作(事务的回滚与提交)

在看本文之前,请确保你已经了解了Oracle事务和锁的概念即其作用,不过不了解,请参考数据库事务的一致性和原子性浅析和Oracle TM锁和TX锁 1.提交事务 当执行使用commit语句可以提交事务.当执行了commit语句后,会确认事务的变化.结束事务.删除保存点.释放锁.在此之前,与当前事务相关的数据都会被加锁,直到当前事务进行了commit操作,如果在这个过程中有其他回话试图操作相关数据,(这些数据已经被当前事务加锁),那么其他回话会进行等待,或者直接返回错误. 注意:只有在提交事务之后

oracle事务知识点小结

DML语句流程 1 获取事务锁和ITL2 锁定候选行3 生成redo4 生成undo5 生成redo record写入log buffer并更改数据块 事务提交1 分配SCN2 更新事务表,将事务槽状态改为0x093 回收undo块4 创建commit redo record5 将redo从log buffer刷新6 释放表锁和行锁 锁一个事务由1个TX和若干TM组成,而回滚savepoint不会释放TX锁: ITL通过XID指向事务槽,进而指向undo记录,其UBA也指向undo记录:两者区别

Oracle事务隔离级别处理差异

Oracle事务隔离是事务读操作不同程度的数据隔离,分为READ_UNCOMMITTED.READ_COMMITTED(默认).SERIALIZABLE. Oracle事务隔离级别SERIALIZABLE,解决脏读.不重复读.幻读两个事务同时update相同记录时,第一个事务可执行,第二个事务阻塞,当第一个事务提交后,第二个事务抛出异常如图1.当第一个事务回滚后,第二个事务继续执行. 图1 Oracle事务隔离级别READ_COMMITTED,解决脏读两个事务同时update相同记录时,第一个事

Oracle事务隔离级别

oracle隔离级别 只有READ COMMITTED和 SERIALIZABLE 因为当有人对数据库的数据进行任何写操作(DML操作)时,Oracle数据库系统首先将原始的数据复制到回滚段中,之后才做相应的操作,在事务处理结束之前其他的用户可以读这些数据,但是读到的都是回滚段上的数据. 参考http://www.cnblogs.com/friends-wf/p/3746348.html Oracle事务隔离级别

Oracle事务之一:锁和隔离

Oracle事务之一:锁和隔离 一. 事务概述 事务管理是数据库处理的核心.数据库既要保证用户能并发地执行事务,还要保证数据库的一致性. 当第一条可执行的SQL开始执行,就隐形地开始了一个事务,直到遇到下面的几种情况: 1.Commit:提交事务. 2.RollBack:回滚. 3.DDL语句:执行和提交DDL语句结果前首先提交当前所有DML语句,成为隐式提交. 4.程序正常退出:自动提交. 5.不正常的程序失败:隐式回滚. 二.事务特性 事务的四个特性:A(原子性).C(一致性).I(隔离性)

Oracle 事务的开始与结束

事务是用来分割数据库活动的逻辑工作单元,事务即有起点,也有终点: 当下列事件之一发生时,事务就开始了: 连接到数据库上,并执行了第一天 DML 语句: 当前一个事务结束后,又输入了另外一条 DML 语句: 当下列事件之一发生时,事务就结束了: 执行 COMMIT 或 ROLLBACK语句: 执行一条 DLL语句,例如 CREATE TABLE 语句:在这种情况下, 会自动执行 COMMIT 语句: 执行一条 DCL语句,例如GRANT语句:在这种情况下,会自动执行COMMIT语句: 断开与数据库