学习oracle技术,每天学一点,每天进步一点
悲观锁定的应用
上一篇 /
下一篇 2008-03-26 11:14:13
/ 个人分类:学习
今天同事发过来的一个问题:
悲观锁定
xxxx 2008年03月26日 10:02:18ITPUB个人空间F_'m V`/X9p
Z
paul,问一下。 锁表是需在开始事务之前做,还是之后做?ITPUB个人空间t&rJ.puk!^#E
Paul Yi(Paul Yi) 2008年03月26日 10:02:51
EC\ P M
nO q5?4@0事务之前
Ir/@V9@(AGy0xxxx 2008年03月26日 10:03:17ITPUB个人空间)d3cYq(C/U7O+z
那解锁是在提交事务之后?
k.haue x}/sv0j3w0Paul Yi(Paul Yi) 2008年03月26日 10:04:29ITPUB个人空间)O5uy$l5m
锁住了这个表还有对这个表其他相关事务操作吗
RG5dJ$Ww
G
@0xxxx 2008年03月26日 10:05:38ITPUB个人空间0s3lh_X7@
]9q)p
是的。
1锁表
G]7v$c6iE02开始事务
fV&V?j03对该表查询ITPUB个人空间,s+jR`Q
4插入或更新
p k Ln*ks"J/g _W05提交事务
C|9|:bt5OJW06解锁
zP;^ [{!H@0Paul Yi(Paul Yi) 2008年03月26日 10:07:11
!P@?+D
e0锁住了这个表查询应该可以但不能对这个表作插入或更新数据吧
Cp+}8srR.sO;s1Xt0xxxx 2008年03月26日 10:08:33
)`X{_![wc7mZ5O
q g0如果有一个业务需要先查询有没有记录,有的话更新该记录,没有的话要插入一条。ITPUB个人空间 kXK,`ZR
但这个业务是并发的,那要怎样处理?
T&oG%X$n0xxxx 2008年03月26日 10:09:05
|7~&Y+N N QT+b,E0我想是先锁表,然后判断有无存在的记录,处理完后解锁。这样来处理并发问题。ITPUB个人空间OSA!JNx/o&`;K
xxxx 2008年03月26日 10:09:19ITPUB个人空间4nq]_!e#qd(u@F
就不会因为并发,同时插入两天一样的记录ITPUB个人空间'pq4j0H4Ga
gH
mn
xxxx 2008年03月26日 10:09:25ITPUB个人空间"c5s4_)g0D:F.c!e
两条ITPUB个人空间.`&k
X)F~H,}
Paul Yi(Paul Yi) 2008年03月26日 10:11:40
Ap|QF6[6tB0select * from table for update 这样你看下
h2y}
I!f7M5c04插入或更新ITPUB个人空间"f7s8YR
oBe_.S
5提交事务ITPUB个人空间_,Otv/^0E
6解锁ITPUB个人空间8JD vbL2\!Vl[U
xxxx 2008年03月26日 10:13:14
'_
kEsN(P,rt+Vz'Q0什么时候开始事务?
6Nn$`yr'^$MSOZ*Q0Paul Yi(Paul Yi) 2008年03月26日 10:13:40
b{;Sekj#Y
x*Y)n$V0select * from table for update 这个就开始了
}fe:FXp0xxxx 2008年03月26日 10:14:26
9Wnj O$c;U
]:gg"H01。开始事务ITPUB个人空间-}&A*vo)O.i|2y\
2。select * from table for update
1G2|$z5Yk4N03。插入或更新ITPUB个人空间2z^K(oz;C h\6Y
5。提交事务
这样的话,就算并发,它也会锁死在第2步中
`hU/oC0Paul Yi(Paul Yi) 2008年03月26日 10:14:40ITPUB个人空间8M ^ }.Qr+w(Z
他这个是锁住记录,并没锁表ITPUB个人空间/S!m!^,m7W4t
xxxx 2008年03月26日 10:16:19
xS-f.a8Kn
Ty0锁住所有记录的话,并发时会停在第2步中,这样就不会有问题了
1m.m&ygw0^/d+Q0Paul Yi(Paul Yi) 2008年03月26日 10:17:06ITPUB个人空间gG3A!o!`
其他用户只能等解锁后才能对这个表进行更新或删除
iL!e7TfYH!I_0xxxx 2008年03月26日 10:18:43ITPUB个人空间*~m;Y&J$S3Qr S&q5j*\
流程:
.m2ph\@ H{}ru01。开始事务ITPUB个人空间+E1nP~;BM~
2。select * from table for update
n M E2c4uxq)A03。查找所要的记录是否存在ITPUB个人空间-M fi O4cXV]-v
4。根据第3步的结果进行插入或更新ITPUB个人空间
e
[S V{)_#H$]
5。提交事务
$h {OLM?0xxxx 2008年03月26日 10:19:09ITPUB个人空间8rZki8U
这样并发操作会等在第2步中,不会因为并发而影相第3步的判断ITPUB个人空间r-V(L.H^r4Ja
Paul Yi(Paul Yi) 2008年03月26日 10:20:33
,JAC"_8e7]|+^0对 如果2步并发时不想让别人等待立即发出信息的话可以加上 select * from table for update nowaitITPUB个人空间2W }X3IFV3N;J5G
并发用户看到的是资源正忙ITPUB个人空间kzR%P|"iCU9P
xxxx 2008年03月26日 10:23:21ITPUB个人空间0ZU-G,X\Y_j*G
THXITPUB个人空间&`
\-J-S
m1pF
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG: