gpt4 book ai didi

java - 使用 jdbctemplate (postgres) 选择更新不工作

转载 作者:行者123 更新时间:2023-11-29 11:51:30 24 4
gpt4 key购买 nike

我希望我的 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);

当我得到结果时,两个列表都有相同的记录。请帮忙。

最佳答案

如果您使用的是 PostgreSQL 9.5 或更高版本,则可以使用

SELECT ...
LIMIT 10
FOR UPDATE SKIP LOCKED;

这将选择并锁定最多 10 个尚未被并发事务锁定的行。

可以与所有 PostgreSQL 版本一起使用的替代方法是使用这样的建议锁:

SELECT ...
WHERE pg_try_advisory_xact_lock(id)
LIMIT 10
FOR UPDATE;

这里的id是主键,假定它是一个整数值(可以隐式转换为bigint的类型)。

如果没有独占 advisory lock,此函数返回 TRUE有了那个数字,并作为副作用捕获了锁。

注意:锁仅在事务期间持有,因此请务必在单个事务中进行锁定和后续数据修改。

关于java - 使用 jdbctemplate (postgres) 选择更新不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42857289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com