Oracle基础(七):数据库事务

一、基本概念
1、事务(Transaction):是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都运行。要么都不运行,它是一个不可切割的工作单位。比如,银行转账工作:从一个账号扣款并使还有一个账号增款,这两个操作要么都运行,要么都不运行。

所以。应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每一个事务结束时,都能保持数据一致性。


2、事务与锁
当运行事务操作时,oracle会在被作用的表上家锁,防止其它用户改表的结构。

3、事务的操作过程
1)事务的開始(默认自己主动開始):setAutoCommit(false)
2)设置保存点:savepoint pointAA
  • 能够设置多个保存点
  • 一旦回退以后,不能再次回退。
3)回滚到保存点(提交后无法回滚):rollback to pointAA;
4)事务提交:commit

2、事务具有下面4个基本特征。

  • Atomic(原子性):事务中包括的操作被看做一个逻辑单元,这个逻辑单元中的操作要么所有成功。要么所有失败。  
  • Consistency(一致性):仅仅有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。
  • Isolation(隔离性):事务同意多个用户对同一个数据进行并发訪问,而不破坏数据的正确性和完整性。同一时候,并行事务的改动必须与其它并行事务的改动相互独立。

  • Durability(持久性):事务结束后,事务处理的结果必须可以得到固化。 
3、事务的语句
  • 開始事物:BEGIN TRANSACTION 
  • 提交事物:COMMIT TRANSACTION 
  • 回滚事务:ROLLBACK TRANSACTION
4、事务的保存点
     SAVEPOINT pointName 保存点名称 --自己定义保存点的名称和位置
     ROLLBACK TO pointName  保存点名称 --回滚到自己定义的保存点

二、事务隔离级别(isolation )

(一)标准事务隔离级别
1、READ UNCOMMITTED:读未提交
  • 发生脏读
2、READ COMMITTED:读已提交
  • 在trasaction A中读取数据时对记录加入共享锁,但读取结束马上释放。其他transaction B对这个记录的试图改动会一直等待直到A中的读取过程结束,而不须要整个trasaction A的结束。所以,在trasaction A的不同阶段对同一记录的读取结果可能是不同的。
  • 可能发生的问题:不可反复读。
3、REPEATABLE READ:可反复读
  • 对于读出的记录。加入共享锁直到transaction A结束。其他transaction B对这个记录的试图改动会一直等待直到trasaction A结束。  
  • 可能发生的问题:当运行一个范围查询时。可能会发生幻读。

4、SERIALIZABLE:序列化
  • 加入范围锁(比方表锁。页锁等),直到transaction A结束。

    以此阻止其他trasaction B对此范围内的insert。update等操作。 

  • 幻读。脏读,不可反复读等问题都不会发生。


(二)事务的问题
1、脏读
  • 当一个事务 A 读取还有一个事务B 尚未提交的改动时,产生脏读。
2、不可反复读
  • 同一查询同一事务 A 中多次进行,因为其它提交事务 B 所做的改动或者删除,每次返回不同的结果集,此时发生非反复读。

3、幻读
  • 同一查询同一事务 A 中多次进行。因为其它提交事务 B 所做的插入操作,每次返回不同的结果集。此时发生幻读。
(三)Oracle的隔离剂别
1、SQL92标准的
1)READ COMMITTED读已提交
  • 这是oracle 默认的事务隔离机制
  • 保证不会脏读,单可能出现非反复读和幻读。
2)SERIALIZABLE:序列化
  • 提供了事务看起来像队列一样一个一个顺序运行。

  • 只能看到在本事务開始前由其它事务提交的更改和在本事务中所做的更改。
  • 保证不会出现脏读、不可反复读和幻读
  • serializable:提供了read-only 事务所提供的读一致性,同一时候又同意DML(update\insert\delete)操作
2、非SQL92标准:read-only
  • 保证不会出现脏读、不可反复读和幻读
  • 仅仅能读,不能操作DML(update\insert\delete)操作。

(四)设置Oracle的隔离剂别
1、设置一个事务的隔离级别
  • set transcation isolation level read committed;
  • set transcation isolation level serializable;
  • set transcation read-only。
2、设置整个会话的隔离级别
  • alter session set isolation_level read committed;
  • alter session set isolation_level serializable;






















posted on 2017-06-01 16:35  ljbguanli  阅读(202)  评论(0)    收藏  举报