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

锁的概述和事务的属性

上一篇 / 下一篇  2007-08-12 16:34:50

一. 为什么要引入锁

51Testing软件测试网|~)Ocg

多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:

T5{7Gk*At.U051Testing软件测试网$W8s2O l!i3\ rz

丢失更新
e,a7Im J s _;ss0A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统51Testing软件测试网:bda-mnkNL6p

xV ]}DB9O0脏读
Csj}&KPO'Pl%{0
A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致51Testing软件测试网D5EXB9y2OVo$sZ

/R@d:M*}0不可重复读51Testing软件测试网3J Ns}BPVp:J
A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致51Testing软件测试网d$}ak-T]!Q5r

#dZ8Ey7u0并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致

1Vt1F(I5UpI0

二  锁的分类

xWsQ Ljb*t1u0锁的类别有两种分法:51Testing软件测试网 Ew/C+Rv%O)p3t
1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁51Testing软件测试网 R{*T#D N-HU^]7}

51Testing软件测试网,M$F*F nx c0xS x

MS-SQL Server 使用以下资源锁模式。

&|%an ]x!{Q8^051Testing软件测试网5f'_s ?KL9nt9XU

锁模式      描述 
x w8~6J;\`)kj#EBL0共享        (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。 
t*i:x[(P#i0更新 (U)     用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 51Testing软件测试网 xQY7ah7x_C-Lq a
排它 (X)     用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。 
m0\Hj,y B nJ7X0意向锁       用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。 
ButOK,RIl-r0架构锁        在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。 
Rz]u9[0大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。 51Testing软件测试网2\4\{${-Nm1n N&g

51Testing软件测试网%a!ac LCS1P-Y

共享锁
(}#hT2c0^f0共 享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释 放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。51Testing软件测试网/G,{W,Y!Jvt+C8y Nh
更新锁51Testing软件测试网9A.l"[0~q:U
更 新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁,然后修改行,此操作要求锁 转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的 转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都 要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。

#V xYg1j)q(`3N0

8Tk~$X9EIZX?0若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。

2A+~(hD"WT#W+R+MT0

(N8O%b?3Y0排它锁51Testing软件测试网KnPxYG
排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。51Testing软件测试网'Im5|0{L}+S u

PF-Z ~o1Y[5BXp5?0意向锁
?:Q}'Bq#x U-y/\7{0意 向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排它 (X) 锁。例如,放置在表级的共享意向锁表示事务打算 在表中的页或行上放置共享 (S) 锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它 (X) 锁。意向锁可以提高性能,因为  SQL Server 仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。

m-NG{8Hd0

k;S v3Q%X9D aS0意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。

z!T'c)s'GQ0

Dq,~bkS0锁模式 描述 
K8ye;U-d$wB0意向共享 (IS) 通过在各资源上放置 S 锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源。 
u!]]PDLwM0意向排它 (IX) 通过在各资源上放置 X 锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源。IX 是 IS 的超集。 51Testing软件测试网5{,A"wU blZ
与 意向排它共享 (SIX) 通过在各资源上放置 IX 锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源。允许顶层资 源上的并发 IS 锁。例如,表的 SIX 锁在表上放置一个 SIX 锁(允许并发 IS 锁),在当前所修改页上放置 IX 锁(在已修改行上放置  X 锁)。虽然每个资源在一段时间内只能有一个 SIX 锁,以防止其它事务对资源进行更新,但是其它事务可以通过获取表级的 IS 锁来读取层次结构 中的底层资源。 51Testing软件测试网~ Ezl frg8^

^@hJ$f0独占锁:只允许进行锁定操作的程序使用,其他任何对他的操作均不会被接受。执行数据更新命令时,SQL Server会自动使用独占锁。当对象上有其他锁存在时,无法对其加独占锁。51Testing软件测试网3giMz+s%ow
共享锁:共享锁锁定的资源可以被其他用户读取,但其他用户无法修改它,在执行Select时,SQL Server会对对象加共享锁。
G h%y`'D-bXK?[0更新锁:当SQL Server准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server确定要进行更新数据操作时,他会自动将更新锁换为独占锁,当对象上有其他锁存在时,无法对其加更新锁。
:U7|._(j9{z+X E02. 从程序员的角度看:分为乐观锁和悲观锁。
0ojR(AD ~T0乐观锁:完全依靠数据库来管理锁的工作
A8qy z@6O4u p0悲观锁:程序员自己管理数据或对象上的锁处理。51Testing软件测试网"m!D&~-[!nL"w

HXjew!S.XE0MS-SQLSERVER 使用锁在多个同时在数据库内执行修改的用户间实现悲观并发控制

k:^ {*q X0

DaLAV!W/O|0l051Testing软件测试网*sWwF`-h1Vz}

6Z0d;J4k8w }0

三  锁的粒度

hpjqq{2Q!i0
&g r \ y G9~K4qq0    锁粒度是被封锁目标的大小,封锁粒度小则并发性高,但开销大,封锁粒度大则并发性低但开销小51Testing软件测试网qBQmh oG `

51Testing软件测试网 m|z|l7LP

SQL Server支持的锁粒度可以分为为行、页、键、键范围、索引、表或数据库获取锁51Testing软件测试网{.`} Z|KAn-v

&f,^%GFq'c0资源         描述 51Testing软件测试网l^R%mt c*X2Viaa
RID         行标识符。用于单独锁定表中的一行。 51Testing软件测试网b~-y2HrD(D3X9Y
键           索引中的行锁。用于保护可串行事务中的键范围。 51Testing软件测试网2nu)u2foH _\$Y
页           8 千字节 (KB) 的数据页或索引页。 
1O|"Cm"W|&a e0扩展盘区     相邻的八个数据页或索引页构成的一组。 51Testing软件测试网8w S {"~"R ?
表           包括所有数据和索引在内的整个表。 
F:\Tg |`Th3^0DB          数据库。 

P~#_7t:l&V8oo051Testing软件测试网 q)m"i^:N


m ^*[6l)Z@051Testing软件测试网yB `1g d$D yS`#eVy

四  锁定时间的长短

51Testing软件测试网u1UAk/m+u

锁保持的时间长度为保护所请求级别上的资源所需的时间长度。 51Testing软件测试网y(P~l1dDk4[4|

0e ^oZ)s zl0用 于保护读取操作的共享锁的保持时间取决于事务隔离级别。采用 READ COMMITTED 的默认事务隔离级别时,只在读取页的期间内控制共享锁。在扫 描中,直到在扫描内的下一页上获取锁时才释放锁。如果指定 HOLDLOCK 提示或者将事务隔离级别设置为 REPEATABLE READ 或  SERIALIZABLE,则直到事务结束才释放锁。

E6e)d8Gc ?OQ051Testing软件测试网2i7Ig4wq)vK o,l@

根据为游标设置的并发选项,游标可以获取共享模式的滚动锁以保护提取。当需要滚动锁时,直到下一次提取或关闭游标(以先发生者为准)时才释放滚动锁。但是,如果指定 HOLDLOCK,则直到事务结束才释放滚动锁。51Testing软件测试网7u7Pk9X_3Wd|

51Testing软件测试网 CW } zV:EXj

用于保护更新的排它锁将直到事务结束才释放。 
V\ _$\7V0如果一个连接试图获取一个锁,而该锁与另一个连接所控制的锁冲突,则试图获取锁的连接将一直阻塞到: 51Testing软件测试网*X,`d,?+|ibW

51Testing软件测试网F8p Gv3dKXf

将冲突锁释放而且连接获取了所请求的锁。

q&uHMXJ`051Testing软件测试网4o c8G3S4f"x5G9V-D l.N

连接的超时间隔已到期。默认情况下没有超时间隔,但是一些应用程序设置超时间隔以防止无限期等待51Testing软件测试网 GT]/CU;e

1.1.       事务的属性

事务具有ACID属性51Testing软件测试网Gl/X6KG'T|9{Q l9n

Atomic原子性, Consistent一致性, Isolated隔离性, Durable永久性51Testing软件测试网wSH/t,qSjp

 51Testing软件测试网&b D*N{C3ac G KX

原子性 51Testing软件测试网 K"~Xnl YV

  就是事务应作为一个工作单元,事务处理完成,所有的工作要么都在数据库中保存下来,要么完全回滚,全部不保留

:VZ3em&xX0

 51Testing软件测试网%nkm+?\eQkj

一致性

aGu;GFf#S5n!v"b%n0

  事务完成或者撤销后,都应该处于一致的状态51Testing软件测试网N*_\ `E8C,ro

 

Z sbe2_0

隔离性51Testing软件测试网"lb6qs^*Q5R[

  多个事务同时进行,它们之间应该互不干扰.应该防止一个事务处理其他事务也要修改的数据时,不合理的存取和不完整的读取数据

nz#l+I j8i5ga-k0

 

)^#d"?^vq}0

永久性51Testing软件测试网&N"P*M-Qu;|

  事务提交以后,所做的工作就被永久的保存下来51Testing软件测试网scD^)am~

1.2.       事务并发处理会产生的问题

丢失更新51Testing软件测试网/]V?9D Qk

   当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题、每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。51Testing软件测试网/V%y%[mG+_ T;K[

 51Testing软件测试网'I&y.U)K}

脏读

3a1VmZQU0

    当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。

'P~0SG uaa(g0

    第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。

Q @m-Qvh+E0

 

V-F FS7U[^|p0

不可重复读51Testing软件测试网 k+VBP$e/pa

    当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。51Testing软件测试网1nR#d"QAs;oE

    不一致的分析与未确认的相关性类似,因为其它事务也是正在更改第二个事务正在读取的数据。

,fpG m.Q6_'^0

    然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取。

0hwj @Jvn0

 

~ H|H%w;B2Oa#J0

幻像读

:e T:Nr:B6j4Inq0

     当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻像读问题。

EX-A t5a \+TD*TN0

     事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其它事务删除。同样,由于其它事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。

Q7AI}| A(Pj0

1.3.       事务处理类型

自动处理事务

b&X caGn%J2s@0

  系统默认每个TSQL命令都是事务处理 由系统自动开始并提交

&Rpyw$t4|op!\W0

 51Testing软件测试网X&E,G D6s+b1uPC

隐式事务

~8h7eB`~'`0

   当有大量的DDLDML命令执行时会自动开始,并一直保持到用户明确提交为止,切换隐式事务可以用SET IMPLICIT_TRANSACTIONS为连接设置隐性事务模式.当设置为ON时,SET IMPLICIT_TRANSACTIONS将连接设置为隐性事务模式。当设置为OFF时,则使连接返回到自动提交事务模式

0U"[^Pb"XK0

 

#T_)iq f)\E0

用户定义事务

~K-k c:p \m2^.Rrv0

    由用户来控制事务的开始和结束 命令有: begin tran commit tran rollback tran命令51Testing软件测试网8B;iv-gv9u

 

@-?'GR%H i o1]0

分布式事务51Testing软件测试网f0H2M.n(I#I1Ze6o O

    跨越多个服务器的事务称为分布式事务,sql server可以由DTc microsoft distributed transaction coordinator来支持处理分布式事务,可以使用BEgin distributed transaction命令启动一个分布式事务处理。51Testing软件测试网r i;|uw [.S&H

1.4.       事务处理的隔离级别

使用SET TRANSACTION ISOLATION LEVEL来控制由连接发出的所有语句的默认事务锁定行为51Testing软件测试网%N9za D&~!DE-BB

从低到高依次是:

,U"~;VF1Aq ?;WMZ9JX0

 51Testing软件测试网ud1vlP

READ UNCOMMITTED

\x%Pxi'}H0

执行脏读或0级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置NOLOCK相同。这是四个隔离级别中限制最小的级别。51Testing软件测试网hUuQ.U*X.|1U%\P[

举例51Testing软件测试网6a FX2O:Y? U9{3_

table1(A,B,C)51Testing软件测试网0eI$rEEJ

A   B   C

2tk;I$O{ ^W1c[0

a1  b1  c151Testing软件测试网;m(b0s(cQlSs.DI

a2  b2  c2

iZ}[-jzuq0

a3  b3  c351Testing软件测试网3USg TW

 

v-]$\L9}U6b-N0

新建两个连接

+V)W KxDG0

在第一个连接中执行以下语句51Testing软件测试网$?Xc[W+_5?

select * from table151Testing软件测试网 ]l_1U8}~Fh

begin tran51Testing软件测试网 IkwH/~

update table1 set c='c'

_5zBwYe6KN0

select * from table151Testing软件测试网+n:R9V[_5B

waitfor delay '00:00:10' --等待10秒51Testing软件测试网\ph,`l z

rollback tran51Testing软件测试网+FYq2n^?Z,^

select * from table151Testing软件测试网6b#w1G2O0L-B6t&@\ |

 51Testing软件测试网 Gw4E C\S;`:P]%D

在第二个连接中执行以下语句

e"K Hu+tNx0

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED51Testing软件测试网8T&K }$h&Mn4FQR-@8xPH

print '脏读'51Testing软件测试网 D$P,w-Gz

select * from table151Testing软件测试网 pM$chG

if @@rowcount>0

9k,F?;Q1~7S.y0

begin

X H)K'S+Q[`(k0

 waitfor delay '00:00:10'51Testing软件测试网:GDR:Gc%~

 print '不重复读'

fiA8sz8n g0

 select * from table1

Pu(}6Q8M]`!p0

en51Testing软件测试网s!\/dg(P'~`

第二个连接的结果51Testing软件测试网2m3? Q \I\B

脏读

R6}:m/x Q*w0

A   B   C51Testing软件测试网s7Kt zQ%V8e1lN'I

a1  b1  c

K.qR5feX-zn0

a2  b2  c

~)U-h]K0

a3  b3  c51Testing软件测试网)g9` ui:yq4qUy

 

;o oN:dc3Y b2{ \0

'不重复读'

o GP-U\j`G0

A   B   C

k*X#@v6Q:AWS;SQl2d0

a1  b1  c151Testing软件测试网%Z]F6A.[K#?

a2  b2  c251Testing软件测试网0\C2R1D r+xY1Y{ @

a3  b3  c3

PQL'k AI6q0

 

k:U4Y)~pY$l0

READ COMMITTED51Testing软件测试网%Zv8[@#V

指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是SQL Server的默认值。

KT5U6XxbFn@V0

 

~D+KzY\![8u4r)V0

在第一个连接中执行以下语句51Testing软件测试网3nvc,^*e:HSry$w

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

:Frb8ph!M#K G0u _Z0

begin tran51Testing软件测试网%i~#u1a5k s7[ o

print '初始'

h+H a'rkP)k d3bn&j0

select * from table1

rJg2? i0

waitfor delay '00:00:10' --等待10秒51Testing软件测试网r7|EL"|c

print '不重复读'

-z*t4LK(g,]ll:H.Wm0

select * from table151Testing软件测试网F.T@}T9n

rollback tran51Testing软件测试网+x$y(Q6R2C2{|!p f

在第二个连接中执行以下语句51Testing软件测试网+X3Q;zR DI0uR7W

SET TRANSACTION ISOLATION LEVEL READ COMMITTED51Testing软件测试网bH Q1aZ%}0`]7z

update table1 set c='c'

8d9r Ov n0

第一个连接的结果51Testing软件测试网.V(S[X-V:O~ d

初始51Testing软件测试网b;qAQl:H-@ b

A   B   C51Testing软件测试网1R:gt:Z9vF

a1  b1  c1

s'G~o/P6Pxo6p0

a2  b2  c251Testing软件测试网)dz)P n'VbU^L

a3  b3  c3

3BQNG Zy']5fv"^u0

 

6s+sv6QBi7Nx0

不重复读

)dsm%JB [0

A   B   C

(s"c'L/N'[ | e0

a1  b1  c

B/_o1J/x9y:\l$@ER%K0

a2  b2  c51Testing软件测试网U(n8E+ADV

a3  b3  c51Testing软件测试网 H2KlB'A8^2Z

 

`1W_!ZH Z&e:_ g)}0

REPEATABLE READ

Z-W4D |'_&@ n0

锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。

(R9W&r,c+kh"K0

 

o(j5n}]Z7Ry0

在第一个连接中执行以下语句

K`Jg7sW$X V uh@ a%t0

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ51Testing软件测试网|n)i XG

begin tran51Testing软件测试网7`$T3D9@j#s

print '初始'

?GqIQw]9s0

select * from table151Testing软件测试网/kM+]l9AU6O

waitfor delay '00:00:10' --等待10秒51Testing软件测试网4xC?k9s2n@Q'e q8R

print '幻像读'51Testing软件测试网 oD?$}7E t;V$eIlk&A

select * from table1

x X5N7jX:L0

rollback tran51Testing软件测试网+`+h!{I2?f1\

在第二个连接中执行以下语句51Testing软件测试网p a8U6gIm*k E7W

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ51Testing软件测试网Q/@)fPZ2ga'q9|

insert table1 select 'a4','b4','c4'51Testing软件测试网Ct6p%J)v,p:t-wv:}1L

第一个连接的结果

]9STE };j0

初始51Testing软件测试网g c"t4Z;Y(~$\#D{}

A   B   C51Testing软件测试网 u p7]:isd GgT

a1  b1  c151Testing软件测试网eBt-Umn2CQx

a2  b2  c2

%Ze{!P0yq4s"z'{9E0n6`0

a3  b3  c351Testing软件测试网 }@wn#t F`o&Uy

 

![!T#K#Q_ Y0

幻像读51Testing软件测试网 ^({{?Z!S }o&KU,c

A   B   C51Testing软件测试网O7V m,X6v3W

a1  b1  c151Testing软件测试网.K-`1`_*\Ec0qp

a2  b2  c251Testing软件测试网Mc&?6iS8b~v s

a3  b3  c351Testing软件测试网?"o m:f q2K

a4  b4  c451Testing软件测试网)n/QWc.sV5fINj

 51Testing软件测试网u&l0Ht,W,^ A

 51Testing软件测试网'tc@5PV}Wy9Gs

SERIALIZABLE51Testing软件测试网"{k4Uf v;i,G_$b

在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有SELECT语句中的所有表上设置HOLDLOCK相同。

n)Q3hOX$g n0

 

&uG;B#\0J uleKa0

在第一个连接中执行以下语句51Testing软件测试网 u(hcr `*_M&E

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

,?f^2zS0

begin tran

/u{3v%Z2}1sz3p5rVy0

print '初始'51Testing软件测试网9iC3NcO,cZ%J$J

select * from table1

7q p'Ky\n7\0

waitfor delay '00:00:10' --等待10秒

#H|]7}i2e&gMg0

print '没有变化'51Testing软件测试网j;dX&g.t ~ E

select * from table151Testing软件测试网2Z.q1kf&n

rollback tran51Testing软件测试网ljp2K2M4o

 51Testing软件测试网v#I\5q;}'Rd

 51Testing软件测试网a._6r'd7p.t)UC:GC

在第二个连接中执行以下语句51Testing软件测试网*GkyT-RGi,CM o

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

W_J\q0

insert table1 select 'a4','b4','c4'51Testing软件测试网8D fg\:A1rq

 51Testing软件测试网G%EW`2S^O r

第一个连接的结果

_ O d[1U)r7Jq+B.U0

初始

-Jc@7sN(x[#k{0

A   B   C51Testing软件测试网U |kb;H9~'x

a1  b1  c1

J4]:~&W3l5c.B/J0

a2  b2  c2

2x$e_s}*b#Ny!p0

a3  b3  c351Testing软件测试网nqmd2Oe J3z.{x

 51Testing软件测试网0L2TiH7h,r

没有变化51Testing软件测试网3[K kE$dt8rA h

A   B   C51Testing软件测试网wQ9A nGu ve

a1  b1  c1

z6I8R*dM ]0

a2  b2  c2

H&Z H0|`/`0

a3  b3  c3

t/tWS1UI.T0

1.5.       事务处理嵌套语法和对@@TRANCOUNT的影响

l        Ø  BEGIN TRAN         @@TRANCOUNT151Testing软件测试网7u*oV Y|jZ'v'j

l        Ø  COMMIT TRAN      @@TRANCOUNT151Testing软件测试网{RGGlIpI

l        Ø  ROLLBACK TRAN   使@@TRANCOUNT回归0

5e`(OS\i0

l        Ø  SAVE TRAN           不影响@@TRANCOUNT51Testing软件测试网GG[%hYp

例一

V1y7fB Jw0

SELECT '事务处理前', @@TRANCOUNT     --值为 0

r|)P5\\0

BEGIN TRAN

z(sT#w-i0

 SELECT '第一个事务', @@TRANCOUNT     --值为 151Testing软件测试网s K yj;S:N

   SELECT * FROM table1

g ]B)b!` F0

   BEGIN TRAN51Testing软件测试网/XZ6sp!x?:K;u

      SELECT '第二个事务', @@TRANCOUNT --值为 251Testing软件测试网@ k(Y(O:D,VMe#?

        DELETE table151Testing软件测试网&y;T#eO$wr/k B

   COMMIT TRAN51Testing软件测试网/M*~I5y1ke2r_$H

   SELECT '递交第二个事务', @@TRANCOUNT --值为 151Testing软件测试网PO Q1vn8`FP

ROLLBACK TRAN

"C&W-`OdoV3o})\0

SELECT '回滚第一个事务', @@TRANCOUNT --值为 0

ZV` hS&Be0

 51Testing软件测试网lK%z&d F-h z

例二

gUL@)Z&~0

SELECT '事务处理前', @@TRANCOUNT     --值为 0

H Gq2o {I0

BEGIN TRAN51Testing软件测试网eY b-t"od,b

 SELECT '第一个事务', @@TRANCOUNT   --值为 1

R8y#lF W]!g]0

   SELECT * FROM table1

)Y I5UHN&\!f6g qO0

 SAVE TRAN t1

'S*Q^ ze B0

 SELECT '保存第一个事务后', @@TRANCOUNT --值为 1

2z-R#_?8k9SH6qA0

   BEGIN TRAN

Ch|y|/Q \ g0

      SELECT '第二个事务', @@TRANCOUNT --值为 251Testing软件测试网3u,L;x7IfL&}m

        DELETE table151Testing软件测试网6~ b']:@:L

  ROLLBACK TRAN t151Testing软件测试网%W2E e#v0Hs H

   SELECT '回滚到保存点t1', @@TRANCOUNT --注意这里的值为 251Testing软件测试网@ z4M)n0O6eX0I

IF @@TRANCOUNT>0

!l&Z/U8Zm2L0

ROLLBACK TRAN

)O!Q/f/m)t~xB9Q0

SELECT '处理结束', @@TRANCOUNT --为 0

-MA3` `_%v_]0

 51Testing软件测试网jsVHj6h!wV)D

SET XACT_ABORT51Testing软件测试网]5PY&n H1PN

控制语句产生运行时错误时,是否自动回滚当前事务

j {N3Dl ?9G'D-]0

比如51Testing软件测试网%`$ax?{2R/K*W$A

SET XACT_ABORT ON

D:dJd Ng'P1q0

BEGIN TRAN

SG%S`N)GpQ0

 SELECT * FROM 一个不存在的表51Testing软件测试网})@e`2\XV8sT

ROLL BACKTRAN51Testing软件测试网Y$K_u1L2~)J

PRINT '处理完毕' --执行结果没有到这一步51Testing软件测试网m4@ `.m-\h

go51Testing软件测试网,Q,^/IjM

SELECT @@TRANCOUNT --值为1 产生孤立事务51Testing软件测试网 t'~5EJK|SO

1.6.       事务调试语句

DBCC OPENTRAN

3Cr6g*D0Xm `0

如果在指定数据库内存在最旧的活动事务和最旧的分布和非分布式复制事务,则显示与之相关的信息。

Ccg8q/[!Db*S'e/TM0

示例

+{ n/^8o9P;ELz0

下例获得当前数据库和pubs数据库的事务信息。51Testing软件测试网"j)Y8l.B0}`l C&w

-- Display transaction information only for the current database.

(_x P[@0

DBCC OPENTRAN

6o9r)ein|"e0

GO

#]8fn#iNW7L+n4e%e0

-- Display transaction information for the pubs database.

8} b_u,E6J2@B0

DBCC OPENTRAN('pubs')

bb Io)_)H2QA y0

GO

r/Uo3`(A'[H_5K(a D0

1.7.       事务嵌套的例子

1)如果内层事务出错就取消所有事务51Testing软件测试网*h+_ V2[nn

BEGIN TRAN t1

NP"`2|'_,A0

 

:D{(htWL S(G0

  UPDATE tablename SET colname='37775' WHERE id='140'

/l3@E,Jk5Z-_9h v:`9sm0

      

D8tdk o%~;ak"Ye0K0

 BEGIN TRAN t251Testing软件测试网\;@2E-GWy \+I/K

 51Testing软件测试网r2JHZDn!q|

  UPDATE tablename SET colname='37775' WHERE id='140' --id不存在51Testing软件测试网 E-k { lnLT6Y

 51Testing软件测试网/`9BM7{x$E*d$c

    IF (@@rowcount=0)

.F e^,T:K#LJxWd0

        BEING51Testing软件测试网 yZg'X%l oh8]

          ROLLBAKC TRAN51Testing软件测试网.U*{:N'C}

         END51Testing软件测试网:qb*fy5a6g

     ELSE

T D#lJ:H ~-a0

         BEGIN

Dz#VzclH0

           COMMIT TRAN t251Testing软件测试网Ws6V@y3O

           COMMIT TRAN t151Testing软件测试网NG*_c_{7?3S }

         END51Testing软件测试网T6q&o#CgT }Z

2)事务处理中只要有一个出错就回滚51Testing软件测试网\O^xM

BEGIN TRAN

:i1_:eq:R%^I.Q0

     UPDATE tablename SET colname='37775' WHERE id=170

VT n&C5T~f0

TAG:

 

评分:0

我来说两句

我的栏目

日历

« 2024-03-28  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

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

RSS订阅