java - Hibernate:并发处理时防止重复插入?

标签 java hibernate concurrency locking

Thread1Thread2都在运行时,是否可以避免将两个Foo对象保存到数据库中?

Thread1 {
    Foo foo = dao.getFoo("bar");
    if(foo == null) {
        foo = new Foo("bar");
        dao.save(foo);
    }
}
Thread2 {
    Foo foo = dao.getFoo("bar");
    if(foo == null) {
        foo = new Foo("bar");
        dao.save(foo);
    }
}

最佳答案

是的。使用数据库唯一约束特性和hibernates基于版本号的并发控制机制。看看here .

对于插入,您需要使用数据库唯一约束功能。对于并发修改,您可以使用 hibernates 乐观锁定并发控制。

唯一约束将防止两个线程为一组(甚至只有一个)列插入具有相同值的记录。 Hibernates 并发控制将在提交更新事务时增加现有记录的版本号,但前提是数据库中的记录仍然具有事务开始时读取的相同版本号。这将防止两个事务基于具有相同版本号的记录成功提交更改。

关于java - Hibernate:并发处理时防止重复插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22536035/

相关文章:

java - 在 Java 中使用 BitSet 跟踪前导零

java - Android ActionBar 发出不同的 API <> 21

java - ConcurrentHashMap 文档说明

haskell - 这些线程是否永远被阻塞?

java - 如何使用 JPA 和 Hibernate 使用映射为 ORDINAL 的枚举参数进行查询

c++ - 调用 "spin"是什么意思

java - 访问 Java 中的包

Java ArrayList 空指针

java - Spring JPA Hibernate 处理大型数据库

java - 为什么我取不回 JSON 内容?