我有邏輯,從數據庫中選擇狀態爲「就緒」 一些行,我需要將狀態更新爲'處理',所以沒有其他線程可以訪問這些行。那麼我必須對結果集中的記錄執行一些邏輯,並且處理完成後,我需要再次將記錄狀態更新爲完成。我們可以一起選擇並更新到數據庫嗎?
問題: 有沒有一種方法可以讓我在執行select語句時 - 當時只有我可以同時更改結果集中返回的行的狀態。
有人可以建議,如果有一種很好的方式在java中實現它。
我有邏輯,從數據庫中選擇狀態爲「就緒」 一些行,我需要將狀態更新爲'處理',所以沒有其他線程可以訪問這些行。那麼我必須對結果集中的記錄執行一些邏輯,並且處理完成後,我需要再次將記錄狀態更新爲完成。我們可以一起選擇並更新到數據庫嗎?
問題: 有沒有一種方法可以讓我在執行select語句時 - 當時只有我可以同時更改結果集中返回的行的狀態。
有人可以建議,如果有一種很好的方式在java中實現它。
您可以在事務中SELECT ... FOR UPDATE NOWAIT
更新之前要處理的行。 SELECT ... FOR SHARE NOWAIT
將失敗,並有錯誤,如果有人正在更新選定的行或某人已經完成SELECT ... FOR SHARE NOWAIT
對他們。
詳情here
。
您可能正在尋找允許您鎖定表格/行(爲您自己)的「鎖」。一個很好的例子可以在PostgreSQL的網站上找到:
http://www.postgresql.org/docs/current/static/sql-lock.html
用鎖將確保只有您可以訪問表/行不會和別人,直到你做。
鎖定整個表可能是一個壞主意。在這種情況下行級鎖定更好。 – 2013-02-21 20:19:11
回答你的主要問題:是的,你可以做到這一點!
正如其他人所說的,SELECT … FOR UPDATE
是您的選擇之一。
另一個是增加序列化級別。請看看this related answer並按照鏈接。
值得一提的是,要達到REPEATABLE READ
甚至SERIALIZABLE
事務將需要在應用程序方面進行更改,因爲這些隔離級別假定某些事務量會回滾並出現序列化錯誤,這是正常的預期的行爲。
此外,更嚴格的隔離級別(以及更多的SELECT … FOR UPDATE
查詢)將導致性能下降,並可能導致競爭條件,具體取決於設計。
請看,看看this article on depesz.com,它很好地概述了相關領域的可能缺點。
這將是一個數據庫功能,而不是編程語言。不過,您可以在Java(或其他PL)中創建一個處理'UPDATE'和'SELECT'語句的函數來解決您的問題。 – 2013-02-21 20:02:09
另一種解決方案可能是創建一個同時執行UPDATE和SELECT語句的存儲過程,然後使用Java中的CallableStatement執行該過程。 – 2013-02-21 20:05:05
我不確定你想要做什麼,但PostgreSQL也有'SELECT FOR UPDATE'功能,它將選擇行並在它們上創建一個訪問鎖:http://www.postgresql.org/docs/9.2/ static/sql-select.html#SQL-FOR-UPDATE-分享 – jcern 2013-02-21 20:15:34