1
我正在處理一種在oracle 11.2表中實現的消息隊列。我知道,這是錯誤的,我仍然擁有它。選擇列並隱藏其他選擇
表由ID,消息,日期和狀態的。所有新消息都插入狀態新。我開發java(JDBC)讀者,挑選最古老的新郵件:
select * from messages
where status = NEW and rownum <= 1
order by date asc
比讀者處理信息,並將它的狀態DONE。它運作良好,而我們有單一的讀者。多讀者的問題是,他們都選擇相同的消息。
我試圖通過更新狀態到工作來解決這個問題。僞代碼是否正確?
//autocommit is on
id = query(select … for update)
query(update messsages set status = WORKING where id = :id)
…do some processing in reader…
query(update messsages set status = DONE where id = :id)
它是否適用於多個併發讀取器?讀者會在大多數時間等待鎖嗎?或者他們只會得到下一個沒有鎖定的行?