我希望我的Java代码有多个实例可以读取相同的数据集,并且我想要锁定第一个实例读取记录(行级别)。这样第二个实例就不会读取相同的数据。以下是我的示例代码,但它无法工作。如果我同时读取两次,我会得到相同的记录。为了测试目的,我创建了列表1和列表2,并依次读取两次以模拟多个实例读取同一数据。
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
隔离级别中其运行方式略有不同。请仔细阅读有关事务隔离的文档。我们只能重复那里写的内容。 - pozs