oracle中行級鎖與表級鎖
最近使用oracle時,如果併發狀態插入資料則會造成資料重複,這時候需要使用oracle的鎖機制,下面是常用的oracle鎖表方法。
一、行級鎖:
(下面這句將給該表的所有行都加上鎖)
select * from person for update;
如果該行記錄已經被鎖定,就不用等待,系統會直接拋錯 ora-00054
select * from person where id = '1' for update nowait
如果該行記錄已經被鎖定,更新的時候等待5秒,如果這5秒內,該行記錄被解鎖,那麼返回查詢結果,如果5秒內仍未解鎖,那麼系統會直接拋錯 ora-00054
select * from person for update wait 5;
另外,如果使用 select * from person where id = '1' for update ,當該行記錄已經被鎖定時,那麼系統將一直等待該行記錄被釋放後,再加鎖。
二、表級鎖:
行共享:允許使用者進行任何操作,禁止排他鎖
lock table person in row share mode;
行排他:允許使用者進行任何操作,禁止共享鎖
lock table person in row exclusive mode;
共享鎖:其他使用者只能看,不能修改
lock table person in share mode;
共享行排他:比共享鎖有更多限制
lock table person in share row exclusive mode;
排他鎖:其他使用者只能看,不能修改,不能加其他鎖
lock table person in exclusive mode;
對於通過lock table命令主動新增的鎖定來說,如果要釋放它們,只需要發出rollback命令即可。