“未来的世界:方向比努力重要,能力比知识重要,健康比成绩重要,生活比文凭重要,情商比智商重要! ”    ——清华大学校长留给毕业生的一段话

数据库并发处理

上一篇 / 下一篇  2007-08-12 16:38:00

 一、并发处理

数据库的特点就是数据的集中管理和共享。在通常情况下总是有若干个事务并发地运行,这些并行的事务可能并发地存取相同的数据。因此,数据库管理系统的一个重要任务就是要有一种机制去保证这种并发的存取和修改不破坏数据的完整性,确保这些事务能正确地运行并取得正确的结果。51Testing软件测试网+b'A0?&E0w gl,^({

我们知道,事务并发执行时若不加控制的话,将导致不正确的结果和数据库的不一致状态。为保证数据库数据正确地反映所有事务的更新,以及在一事务修改数据时其它事务不同时修改这个数据,数据库系统用锁来控制对数据的并发存取。

~|#\e6xo4}0

二、ORACLE的并发处理机制

无需任何说明,ORACLE自动提供行级锁,它允许用户在没有冲突的情况下更新表中不同的行。行级锁对联机事务处理非常有用。

@ N d~J0

1ORACLE

ORACLE锁的类型在正常情况下,ORACLE会自动锁住需要加锁的资源以保护数据,51Testing软件测试网q#RK&E#b2kO)L

这种锁是隐含的,叫隐含锁。然而,在一些条件下,这些自动的锁在实际应用时并不能满足需要,必须人工加一些锁。这些人工加的锁叫显示锁。

&{ KJCH3B-j7A0

下面指明了会产生隐含锁的SQL语句:51Testing软件测试网*MtdCNFK\4[

INSERT51Testing软件测试网2@~3Owcs%vI

UPDATE

| P)k:F Y n0

DELETE51Testing软件测试网{ EXc'o L]]oPh

DDL/DCL语句。

fc K7L&w|0

下面指明了会产生显示锁的SQL语句:51Testing软件测试网B(`v hfi)UL

SELECT FOR UPDATE

,EqwC2B e0

LOCK TABLE INXXX MODE

dsMnm\v.QR0

解决读的不可重复性可以用下面的方法。在ORACLE中,用SELECT FOR UPDATE对预期要修改的记录加行排它锁(X),对表加行共享锁(RS)。它常用于要锁住一行,但不去真的修改这一行。锁之间是有相互作用的。

y5m J t!v?0

例如,更新时会对表加RX锁,对行加X锁,而只有RS锁和RX锁允许再加RX锁。因此,当存在RSRX锁时,表允许更新。再比如,当执行DDLDCL语句时,会对表加排它锁X,而在存在XRSSRXRXS锁的前提下,都不能再加X锁。因此,当存在XRSSRXRSS锁时,不能对表做DCLDDL操作。这样,数据库会自动防止一个用户更新表中的数据,而其他用户在同时修改表的结构。

6B Z&g-Z4N UE0

2ORACLE只读事务

ORACLE支持只读事务。只读事务有以下特点:51Testing软件测试网2r(a1b,[CO)\6|

*在事务中只允许查询51Testing软件测试网 h E8Q w?V N

*其它事务可修改和查询数据

(R&Zh*H U$O[+p,_0

*在事务中,其它用户的任何修改都看不见

8bYF0kd{:`0

只读事务的写法为:51Testing软件测试网 B"D!R8U5~o m

SET TRANS ACTION READONLY51Testing软件测试网{)T.q+G[-Hc%H

SQL语句51Testing软件测试网;Q8A:d7wd"x

COMMITROLLBACKDDL结束只读事务

)K/@!r-\r,J? s!v0

3、事务一致性的级别

事 务是定义和维护一致性的单位,封锁就是要保证这种一致性。如果对封锁的要求高会增加开销,降低并发性和效率;有的事务并不严格要求结果的质量(如用于统计 的事务),如果加上严格的封锁则是不必要和不经济的。因此有必要进行进一步的分析,考察不同级别的一致性对数据库数据的质量及并行能力的影响。

p|"R7Dx0

一致性级别定义为如下的几个条件:51Testing软件测试网Pi\)Z%d

1)       事务不修改其它任何事务的脏数据。脏数据是被其它事务修改过,但尚未提交的数据。51Testing软件测试网(cI:]uk1FL

2)       在事务结束前不对被修改的资源解锁。51Testing软件测试网I6eu,^W p(U Z

3)       事务不读其它任何事务的脏数据。

1f&v|Ok1[0

4)       在读前对数据加共享锁(RS)和行排它锁,直至事务结束。

4ek Y,Cc7qI A0

*满足条件1的事务叫第0级事务。51Testing软件测试网 y8D%Q@I l6O/L

*满足条件12的事务叫第1级一致性事务。51Testing软件测试网*[ ~h(G|FPw

*满足条件123的事务为2级一致性事务。51Testing软件测试网1CT3d.?.Y

ORACLE的读一致性保证了事务不读其它事务的脏数据。51Testing软件测试网V,XOk5Joc2C lB

*满足条件1234的事务叫第3级一致性事务。51Testing软件测试网+_8X{A$M*K N$\j

ORACLE的三个性质:自动加隐式锁、在事务结束时释放锁和读一致性,使ORACLE成为自动满足以上的012级一致性事务。因此,ORACLE自动防止了脏读(写-读依赖)。但是,ORACLE不能自动防止丢失修改(写-写依赖),读的不可重复性(读-写依赖),彻底解决并发性中的问题还需满足第4个条件(3级一致性事务),这需要程序员根据实际情况编程。51Testing软件测试网+b1uQ P/V _

方法如下:

Vk(zBuzH D0

*如果想在一段时间内使一些数据不被其它事务改变,且在本事务内仅仅查询数据,则可用SETTRANSACTIONREADONLY语句达到这一目的。51Testing软件测试网gy ?hJe{g0xr

*如果想在一事务内修改一数据,且避免丢失修改,则应在读这一数据前用SELECTFORUPDATE对该数据加锁。

M6uX/K,h,i5E0

*如果想在一事务内读一数据,且想基于这一数据对其它数据修改,则应在读数据前对此数据用SELECTFORUPDATE加锁。对此种类型的应用,用这条SQL语句加锁最恰当。51Testing软件测试网Idv!Z dP_}p R

*如果想避免不可重复读现象,可在读前用SELECTFORUPDATE对数据加锁,或用SET TRANS ACTION READONLY设置只读事务。51Testing软件测试网o@ |BWO]b"D e

三、SYBASE的并发处理机制

SYBASE的并发处理方法与ORACLE类似,但在很多方面不一样。SYBASE有两种粒度的封锁,一种的粒度是页,另一种的粒度是表。SYBASE根据SQL语句的情况决定用页封锁还是用表封锁。51Testing软件测试网+qVjwH&V g.Y'Q

1、页级锁

页级锁有以下所始的三类:51Testing软件测试网eV D3},@|

*SHARED:在读操作时加共享锁。在缺省状态下,在读操作完成后释放共享锁。51Testing软件测试网j[[0W$@0? A!v/Zv

*EXCLUSIVE:在更新操作时加排它锁。在缺省状态下,在事务完成后释放排它锁。51Testing软件测试网\-q |;NaT2S0x

*UPDATE:在修改和删除操作的初期(读到被修改或删除的页时)加修改锁。在表上加了修改锁之后,还可以再加共享锁,但不能再加修改和排它锁。在进行修改和删除操作时,如果没有共享锁存在,修改锁则转化为排它锁。此锁的目的是为了防止死锁。SYBASE仅当在WHERE子句中包含索引列时才会使用页级的排它锁和修改锁。51Testing软件测试网&w(I}4{g

2、表级锁

表级锁有以下所示的三类:51Testing软件测试网@zF+|u S dej.o

*INTENT:当表中存在页级的排它锁和共享锁时,在表上加意向锁。在所有的页级锁释放后,意向锁随着释放。

Qz t2MW N0

*SHARED:在读操作时加共享锁。在缺省状态下,在读操作完成后释放共享锁。

VFZ"j@5d&v0

*EXCLUSIVE:在更新操作时加排它锁。在缺省状态下,在事务完成后释放排它锁。51Testing软件测试网qa%Qv F'T

3、请求锁

请求锁用以防止共享锁一个接一个无休止地加在表上,从而写事务(要加排它锁)无法进行。51Testing软件测试网"f#d WjX9}-`$nx+\:};]

4SYBASE的封锁级别

SYBASE根据ANSI标准定义事务的封锁级别:

q\:tD y%Ei8NtG0

(1)   级别1:脏读

H-}` E(dE2xf*M:N b0

(2)   (2)级别2:不可重复读

r0Z x@8`Pv1O0

(3)   (3)光标带来的当前值混乱51Testing软件测试网N ak EF*h

(4)   SYBASE的缺省一致性级别为1

dY Z5DZ0`3E,t$[e"^0

如果要达到一致性级别23,必须使用HOLDLOCK关键字把共享锁持续到事务的结束。方法如下:

[:b;P2IjR0B0

SELECT*FROM AUTHS HOLDLOCK51Testing软件测试网b6^+VN`#uR3@

WHERE AUTHOR_CODE='A00001'51Testing软件测试网,AU*R5@:s\g

SYBASE还可以通过T-SQLSET命令改变SYBASE的一致性级别,从而使SYBASE自动在SELECT语句中加HOLDLOCK关键字:

*h%A/]&@wT0

SET TRANS ACTION IS OLATION LEVEL3

G*T J-B+vI0

5、在SYBASE中提高并发效率的方法

*避免在表中特定的页上多个用户过多的封锁。51Testing软件测试网6[7f2lx3Z:g d

*避免在人机交互的应用中定义事务,这样会使某个用户长时间封锁

-[7E YuM2r0

住表(如去接电话),使其他用户持续等待。

0i$Rj2yEq8C rr8B0

*使事务尽量的短。51Testing软件测试网.O5b5w.`&cx

*仅当必要时才使用HOLDLOCK关键字。

(pm:bg\7g i0

TAG:

 

评分:0

我来说两句

我的栏目

日历

« 2024-04-18  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 58005
  • 日志数: 103
  • 图片数: 4
  • 文件数: 2
  • 建立时间: 2007-05-20
  • 更新时间: 2010-11-23

RSS订阅

Open Toolbar