当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);
}
}
答案 0 :(得分:3)
是。使用数据库唯一约束功能并休眠基于版本号的并发控制机制。看看here。
对于插入,您需要使用数据库唯一约束功能。对于并发修改,您可以使用hibernates乐观锁定并发控制。
唯一约束将阻止两个线程插入一组(甚至只有一列)具有相同值的记录。提交更新事务时,Hibernates并发控制将增加现有记录的版本号,但前提是数据库中的记录在事务开始时仍然读取相同的版本号。这将根据具有相同版本号的记录阻止两个事务成功提交更改。