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

时间:2014-03-20 14:29:31

标签: 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);
    }
}

1 个答案:

答案 0 :(得分:3)

是。使用数据库唯一约束功能并休眠基于版本号的并发控制机制。看看here

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

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