java - JdbcTemplate SELECT ... FOR UPDATE - 无锁

标签 java sql spring oracle jdbctemplate

我正在使用 Spring 框架中的 JdbcTemplate

数据库是Oracle

简化代码:

void m() {
    setAutocommit(false); // the same result with/without this line (by default: true )
    JdbcTemplate jt;
    ...
    String selectForUpdateLine = "SELECT X FROM T ... FOR UPDATE";
    int x = jt.queryForList(selectForUpdateLine, objs, types, Smth.class).size();
    ...
    addDelay(); // to be sure that I can simulate 2 consecutive SELECTs (just for test)
    ...
    if ( x == 0 )
        jt.update(insertLine, objs2, types2); // insert
    else
        jt.update(updateLine, objs2, types2); // update
}

如果我调用 m() 两次,它会执行:

选择 > 选择 > 插入/更新 > 插入/更新

但是我想要

选择 > 插入/更新 > 选择 > 插入/更新

我希望在第一个SELECT之后有一个锁(基于SELECT ... FOR UPDATE的优点),但是两个选择都被调用,所以更新/插入效果不佳。

我还尝试使用 @Transactional 作为该方法,尝​​试创建一个同时包含 INSERTUPDATE 的事务/INSERT,但没有成功。 例如:

@Transactional(isolation=Isolation.SERIALIZABLE,propagation=Propagation.REQUIRES_NEW)

如何确定 SELECTUPDATE/INSERT 将一起运行? (有/没有SELECT ... FOR UPDATE@Transactional等)

最佳答案

您不能只发出一条 MERGE 语句,然后让数据库为您完成艰苦的工作,而不是先执行 SELECT FOR UPDATE,然后再执行 INSERT 或 UPDATE。您可能需要检查您要合并的表是否具有适当的唯一约束,例如

void m() {
    JdbcTemplate jt;
    ...
    jt.update(mergeLine, objs2, types2); // merge
}

关于java - JdbcTemplate SELECT ... FOR UPDATE - 无锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25445577/

相关文章:

java - JPA 持久多对多错误 未选择数据库

java - 无法退出此循环?

java - 如何将项目正确删除到 Android Studio 中?

java - OpenGL Java 获取 3D OBJ 模型的属性

c# - 根据数据库表列值禁用gridview行

sql - sql中整数到字符串的转换函数

mysql - 尝试在 View 创建中添加更新

java - 从外部服务器在 Thymeleaf 中渲染 html 片段

java - Spring JPA 功能允许在不同实体之间重用单个 Repo 方法

java - 如何修复最常见的 LazyInitializationException - Hibernate JPA