学习oracle技术,每天学一点,每天进步一点

悲观锁定的应用

上一篇 / 下一篇  2008-03-26 11:14:13 / 个人分类:学习

今天同事发过来的一个问题:

悲观锁定

xxxx 2008年03月26日 10:02:18ITPUB个人空间F_'mV`/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个人空间)O5u y$l5m
锁住了这个表还有对这个表其他相关事务操作吗
RG5d J$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插入或更新
pkLn*k s"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+NNQT+b,E0我想是先锁表,然后判断有无存在的记录,处理完后解锁。这样来处理并发问题。ITPUB个人空间OSA!J Nx/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|Q F6[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什么时候开始事务?
6N n$`yr'^$MSOZ*Q0Paul Yi(Paul Yi) 2008年03月26日 10:13:40
b{;S ekj#Y x*Y)n$V0select * from table for update 这个就开始了
}fe:F Xp0xxxx 2008年03月26日 10:14:26
9WnjO$c;U ]:gg"H01。开始事务ITPUB个人空间-}&A*vo)O.i|2y\
2。select * from table for update
1G2|$z5Yk4N03。插入或更新ITPUB个人空间2z^K(oz;Ch\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$S3Q r S&q5j*\
流程:
.m2ph \@H{}ru01。开始事务ITPUB个人空间+E1nP~;BM~
2。select * from table for update
n ME2c4uxq)A03。查找所要的记录是否存在ITPUB个人空间-M fiO4c XV]-v
4。根据第3步的结果进行插入或更新ITPUB个人空间 e [SV{)_#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
,J AC"_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:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-08-30  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 15402
  • 日志数: 276
  • 图片数: 2
  • 建立时间: 2007-12-11
  • 更新时间: 2008-08-29

RSS订阅

Open Toolbar