2011-07-16 21 views
0

我想在Oracle數據庫中實現一個隊列,基本上使用一個表作爲隊列,並試圖決定如何防止多個會話同時插入到表中,並搞亂了排序。獨佔鎖是防止多個會話同時插入的唯一方法嗎?

正在做LOCK TABLE mytable IN EXCLUSIVE MODE防止多個會話插入表的唯一方法?

編輯:

「隊列」在這裏可能不是正確的術語。更多的列表,其中元素之間的相對順序是重要的。我正在考慮Java的ArrayList

回答

7

你確定你需要實現自己的隊列嗎? Oracle提供built-in queuing (called Oracle Advanced Queuing)。這肯定會比自己實施同樣的事情更好。

如果你自己實現了一個隊列,爲什麼你需要防止併發插入?你關心什麼順序「搞砸」?假設您使用的是Oracle序列對象來填充主鍵,我沒有看到任何阻止併發更新的原因。

+0

我打算髮布相同的東西。如果你不想鎖定,那麼你排隊。 – SQLMason

+0

Oracle AQ似乎純粹是FIFO,我希望能夠隨着優先級改變重新排列隊列中的項目。從我在文檔中讀到的內容中,我只能看到入隊和出隊的方法,不會更改隊列中元素的位置或刪除任意元素。 – eaolson

+1

@eaolson - AQ也支持優先級隊列http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96587/qsample.htm#64828 –

1

我完全不清楚你試圖避免什麼問題。

顯式鎖定提供了序列化,但似乎沒有提供任何有意義的確定性插入順序。如果兩個會話試圖插入「在同一時間」,哪一個首先獲得鎖定基本上是隨機的。如果表有一個主鍵,你會得到相同的效果而不顯式鎖定,因爲多個插入必須序列化以實現唯一性。但即使沒有這一點,一個會話最終會在另一個會話之前插入(或者更重要的是,將其插入)。

聽起來您似乎對項目需要的訂單有一定的瞭解,而與插入的順序無關。沒有更多細節,我對此的反應是該表應該有一個表示排序的列,表的讀者應該利用它來正確地排序記錄。回想一下,數據庫表沒有固有的順序;僅僅因爲一行在另一行之前插入並不意味着它們按照該順序存儲或按照該順序返回查詢。

+0

強制對包含數字列的行執行命令正好我正在努力做什麼。 – eaolson

+0

@ealoson - 所以,不要擔心插入行的順序。當您從表中選擇行時,ORDER BY數字列。如果你真的想在行上實施物理存儲排序,索引組織的表可能是有效的,但我真的沒有看到任何有利的理由。 –

+0

會議1:插入項目#3,會話2:插入項目#3,會話1:提交,會話2:提交。這就是我想要避免的。我並不真正擔心物理存儲順序,只是維護行的順序。 – eaolson