当Thread1
和Thread2
都在运行时,是否可以避免将两个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/