2013-03-29 46 views
4

只是使用JDBC在po​​stgres數據庫中鎖定表格的快速問題。我有一張我要添加新記錄的表,但是,要爲主鍵執行此操作,我使用遞增的整數值。在JDBC中使用postgres鎖定表格

我希望能夠在Java中檢索此列的最大值並將其存儲爲一個變量,以便在添加新行時用作新的主鍵。

這給我一個小問題,因爲這將被建模爲多用戶系統,當2個位置請求相同的最大值時會發生什麼?這當然會在嘗試添加相同的主鍵時產生問題。

我意識到我應該使用表上的EXCLUSIVE鎖來防止在讀取或寫入的同時獲取密鑰並添加新行。但是,我似乎無法找到任何方法來處理JDBC中的表鎖定,只是標準事務。

僞代碼,例如:

primaryKey = "SELECT MAX(id) FROM table1;"; 
primary key++; 
//id retrieved again from 2nd source 

"INSERT INTO table1 (primaryKey, value 1, value 2);" 

回答

5

你是絕對正確的,如果兩個位置大約在同一時間要求,你會碰到一個競爭狀態。

處理這個問題的方法是在postgres中創建一個sequence並選擇nextval作爲主鍵。

我不知道你的標題和你的數據處理方式,但你也可以將列設置爲serial,甚至不需要在插入查詢中包含該列。該列將自動自動增量。