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

Jam*_*mes 2 java concurrency hibernate 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Har*_*ezz 7

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

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

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