日期:2014-05-16  浏览次数:20467 次

oracle 数据库事务
数据库事务:

事务:逻辑工作单元,包含1至多条语句,要么全部成功,要么全部失败,
      以commit结尾持久化更改或以rollback撤销操作

ACID 属性:

Atomic(原子性):
    整个事务作为同一个单元要么全部成功要么全部失败。
Consistency(一致性):
   事务中的操作保证数据库中的数据不会出现逻辑上不一致的情况,一致性一般会隐含的包括在其他属性之中。
Isolition(隔离性):
    事务允许多个用户对统一数据进行那个并发访问,而不破坏数据的正确性和完整性。
    同时,并行事务的修改必须与其他并行事务相互独立。由事务的锁来控制
Durabliity(持久性)
    事务处理后,事务处理结果必须能够得到固化。


     事务是多用户数据库和并发计划的基石。一旦一个事务提交成功,这个事务引起的变化将会变成
永久的,对其他事务是可见的。虽然很多事务执行时间很短,但是在事务提交成功前,事务引起的变化对
其他事务是无效的。所以每个事务必须隔离起来互不干涉(for 数据完整性)。实现这个的机制是锁。

锁:
  1.write lock|exclusive lock
        在事务执行过程中,排他锁被获取和应用,排他锁在commit||rollback执行是释放。排它锁同时只能被一个
    用户获取,所以同时只有一个用户修改
  2.read lock|shared lock
     shared lock 可以同时被任意多的用户获取用来检索数据。
     被加了共享说的数据在这个事务结束前不能加排他锁。其他数据智能读取数据不能修改。
     oracle使用共享锁的情况是 select ... for update 语句,其它情况没有共享锁
     ---reference other:
     共享锁(S锁)又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加
    S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何
    修改。
      排他锁(X锁)又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A
    加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A



并发和竞争
      并发越多,锁之间的冲突就会有多,竞争就越多,性能就会下降。oracle使用multiversion read concurrency
      scheme可以大大降低这种竞争。

数据完整性问题:
      1.Lost updates
          两个修改对同一个数据进行修改,a会覆盖b的修改数据(排他锁设计为了解决这个问题)
      2.Dirty reads
         数据库允许一个事务读取被另一事务修改的数据,但是这个事务所做的修改还为提交进行持久化,
      这些修改可能会被回滚,所以这个数据读取的事务就是不正确的。很多数据库允许脏读以避免排它锁的竞争。
      3.Nonrepeatable reads
          其他事务修改数据的结果。一个事务特定的条件进行查询数据。在这个事务结束前,查询结果返回后,
      另一个事务修改了数据,导致这些数据不再满足原来的查询条件,如果这个条件查询在执行一次,结果就不同。
      4.Phantom reads 幻读
         一个事务进行查询,在查询结果返回而这个事务结束前,另一事务插入一条新数据也符合前面的查询结果,这是
      事务要根据查询结果尽心相应的修改就不准确 了。


      Serialization 串行化


      oracle多用户并发控制:multiversion read consistency(mvrc)
          mvrc确保用户看到的他所需要的数据始终如一。如果另一个用户修改了这些数据,在这个用查询执行的过
      程中。oracle会维护一个这个数据在查询开始时的数据版本,如果在查询开始的时候,这些修改数据的事务为提交
      ,oracle会确保忽视这些事务的修改。查询结果只会在查询开始时,已经提交的事务的基础上找。
        1.oralce读数据不加任何锁
        2.用户会得到一个完整的数据快照,不受其它事务干扰


oracle 隔离级别:
   1.read commit:
      statement level serialization
      每一个语句,在语句开始时,会获取一个此刻的数据快照。一个事务有多条语句,如果语句之间存在其它完成的事务,
      这可能引起不可持续读和幻读。oracle的默认隔离级别

   2.serializable
      transaction level:一个事务中的语句共享同一个数据快照(在事务开始时存在的数据)
   3.read-only
  




Oracle Concurrency Features 并发特点
 
  1.Rollback segments 回滚片段
     回滚片段目的是为了事务回滚到事务前数据信息。当事务开始修改数据块时,首先会把这个时刻的数据快照
  写入到rollback segment。rollback segment中的信息是回滚事务和多版本读取数据一致性的前提。
     回滚片段不同于重做日志。重做日志是记录数据库所有的事务,当系统突然宕机的时候恢复数据库,