一 并发处理
数据库的特色就是数据的集中管理和共享。在一般状况下老是有若干个事务并发地运行,这些并行的事务可能并发地存取相同的数据。所以,数据库管理系统的一个重要任务就是要有一种机制去保证这种并发的存取和修改不破坏数据的完整性,确保这些事务能正确地运行并取得正确的结果。咱们知道,事务并发执行时若不加控制的话将致使不正确的结果和数据库的不一致状态。为保证数据库数据正确地反映全部事务的更新以及在一事务修改数据时其它事务不一样时修改这个数据,数据库系统用锁来控制对数据的并发存取。
二 ORACLE的并发处理机制
无需任何说明,ORACLE自动提供行级锁,它容许用户在没有冲突的状况下更新表中不一样的行。行级锁对联机事务处理很是有用。
1 ORACLE锁的类型
在正常状况下,ORACLE会自动锁住须要加锁的资源以保护数据,这种锁是隐含的,叫隐含锁。然而,在一些条件下,这些自动的锁在实际应用时并不能知足须要,必须人工加一些锁。这些人工加的锁叫显示锁。
下面指明了会产生隐含锁的SQL语句:
INSERT;
UPDATE;
DELETE;
DDL/DCL语句。
下面指明了会产生显示锁的SQL语句:
SELECT FOR UPDATE;
LOCK TABLE IN XXX MODE。
解决读的不可重复性能够用下面的方法。在ORACLE中,用SELECT FOR UPDATE对预期要修改的记录加行排它锁(X),对表加行共享锁(RS)。它经常使用于要锁住一行,但不去真的修改这一行。锁之间是有相互做用的。例如,更新时会对表加RX锁,对行加X锁,而只有RS锁和RX锁容许再加RX锁。所以,当存在RS和RX锁时,表容许更新。再好比,当执行DDL和DCL语句时,会对表加排它锁X,而在存在X、RS、SRX、RX和S锁的前提下,都不能再加X锁。所以,当存在X,RS,SRX,RS或S锁时,不能对表作DCL和DDL操做。这样,数据库会自动防止一个用户更新表中的数据,而其余用户在同时修改表的结构。
2 ORACLE只读事务
ORACLE支持只读事务。只读事务有如下特色:程序员
只读事务的写法为:
SET TRANSACTION READ ONLY
SQL 语句
COMMIT,ROLLBACK,DDL结束只读事务
3 事务一致性的级别
事务是定义和维护一致性的单位,封锁就是要保证这种一致性。若是对封锁的要求高会增长开销,下降并发性和效率;有的事务并不严格要求结果的质量(如用于统计的事务),若是加上严格的封锁则是没必要要和不经济的。所以有必要进行进一步的分析,考察不一样级别的一致性对数据库数据的质量及并行能力的影响。数据库
一致性级别定义为以下的几个条件:
(1) 事务不修改其它任何事务的脏数据。脏数据是被其它事务修改过,但还没有提交的数据。
(2) 在事务结束前不对被修改的资源解锁。
(3) 事务不读其它任何事务的脏数据。
(4) 在读前对数据加共享锁(RS)和行排它锁,直至事务结束。编程
证了事务不读其它事务的脏数据。并发
由ORACLE的三个性质:自动加隐式锁、在事务结束时释放锁和读一致性,使ORACLE成为自动知足以上的0、1和2级一致性事务。所以,ORACLE自动防止了脏读(写-读依赖)。可是,ORACLE不能自动防止丢失修改(写-写依赖),读的不可重复性(读-写依赖),完全解决并发性中的问题还需知足第4个条件(3级一致性事务),这须要程序员根据实际状况编程。
方法以下:事务