悲觀鎖定的應用

paulyibinyi發表於2008-03-26

今天同事發過來的一個問題:

悲觀鎖定

xxxx 2008年03月26日 10:02:18
paul,問一下。 鎖表是需在開始事務之前做,還是之後做?
Paul Yi(Paul Yi) 2008年03月26日 10:02:51
事務之前
xxxx 2008年03月26日 10:03:17
那解鎖是在提交事務之後?
Paul Yi(Paul Yi) 2008年03月26日 10:04:29
鎖住了這個表還有對這個表其他相關事務操作嗎
xxxx 2008年03月26日 10:05:38
是的。

1鎖表
2開始事務
3對該表查詢
4插入或更新
5提交事務
6解鎖
Paul Yi(Paul Yi) 2008年03月26日 10:07:11
鎖住了這個表查詢應該可以但不能對這個表作插入或更新資料吧
xxxx 2008年03月26日 10:08:33
如果有一個業務需要先查詢有沒有記錄,有的話更新該記錄,沒有的話要插入一條。
但這個業務是併發的,那要怎樣處理?
xxxx 2008年03月26日 10:09:05
我想是先鎖表,然後判斷有無存在的記錄,處理完後解鎖。這樣來處理併發問題。
xxxx 2008年03月26日 10:09:19
就不會因為併發,同時插入兩天一樣的記錄
xxxx 2008年03月26日 10:09:25
兩條
Paul Yi(Paul Yi) 2008年03月26日 10:11:40
select * from table for update 這樣你看下
4插入或更新
5提交事務
6解鎖
xxxx 2008年03月26日 10:13:14
什麼時候開始事務?
Paul Yi(Paul Yi) 2008年03月26日 10:13:40
select * from table for update 這個就開始了
xxxx 2008年03月26日 10:14:26
1。開始事務
2。select * from table for update
3。插入或更新
5。提交事務

這樣的話,就算併發,它也會鎖死在第2步中
Paul Yi(Paul Yi) 2008年03月26日 10:14:40
他這個是鎖住記錄,並沒鎖表
xxxx 2008年03月26日 10:16:19
鎖住所有記錄的話,併發時會停在第2步中,這樣就不會有問題了
Paul Yi(Paul Yi) 2008年03月26日 10:17:06
其他使用者只能等解鎖後才能對這個表進行更新或刪除
xxxx 2008年03月26日 10:18:43
流程:
1。開始事務
2。select * from table for update
3。查詢所要的記錄是否存在
4。根據第3步的結果進行插入或更新
5。提交事務
xxxx 2008年03月26日 10:19:09
這樣併發操作會等在第2步中,不會因為併發而影相第3步的判斷
Paul Yi(Paul Yi) 2008年03月26日 10:20:33
對  如果2步併發時不想讓別人等待立即發出資訊的話可以加上  select * from table for update nowait
併發使用者看到的是資源正忙
xxxx 2008年03月26日 10:23:21
THX

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7199859/viewspace-217914/,如需轉載,請註明出處,否則將追究法律責任。

相關文章