我想要我的java代碼的多個實例讀取相同的一組數據,並且我想鎖定第一個實例讀取的記錄(行級別)。這樣第二個實例不會讀取相同的數據。這裏是我的示例代碼不起作用。如果我同時讀兩次,我會得到相同的記錄。爲了測試目的,我創建了列表1和列表2,並一個接一個地讀取兩次,以模擬多個實例讀取相同的數據。選擇更新不工作使用jdbc模板(posgres)
query = "SELECT * from xyz LIMIT 10 FOR UPDATE of xyz"
List<XYZ> list1= new ArrayList<XYZ>();
List<XYZ> list2= new ArrayList<XYZ>();
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);
TransactionStatus s=datasourceconfig.platformTransactionManager.getTransaction(def);
try {
list1= datasourceconfig.queryForObjectList(query , paramMap ,XYZ.class);
} catch (Exception ex) {
log.error("", ex);
}
try {
list2= datasourceconfig.queryForObjectList(query,paramMap,XYZ.class);
} catch (Exception ex) {
log.error("", ex);
}
empDsCfg.platformTransactionManager.commit(s);
當我得到結果時,兩個列表都有相同的記錄。請幫助。
我不確定您是否瞭解FOR UPDATE鎖的用途。他們(通常)只是阻止**其他**交易來修改選定的行(但從不*隱藏*他們)。如果您讀取同一個事務中的行,則永遠不會發生這種阻塞。而且,它在'SERIALIZABLE'隔離中的工作方式有所不同。請仔細閱讀[關於事務隔離的文檔](https://www.postgresql.org/docs/current/static/transaction-iso.html)。我們只能重複一遍,那裏有什麼。 – pozs