Hibernate并发插入

Vik*_*bin 9 concurrency hibernate insert

我遇到了一个问题.我有一个带有Hibernate的App,它将XML文件中的数据加载到并发模式的表中.某些部分数据可能相同,可以从不同的线程插入.每个线程都在自己的长期交易中工作.当两个或更多踏板试图提交交易时会出现问题.例如,两个线程将记录插入到对NAME字段具有约束的表City中.这意味着在flush()或commit()上发生ConstraintViolationException.我想自动处理这种冲突,并希望用旧的已插入对象替换新的问题对象.这可能吗?我在Hibernate中查看saveOrUpdate()和乐观版本控制.

axt*_*avt 2

我假设您使用基于 MVCC 的 DBMS之一。

如果事务隔离级别不高于 READ COMMITTED,则可以通过在name插入新城市之前发出查询来检查是否存在相同的城市,从而降低冲突的可能性。

请注意,saveOrUpdate()这里没有帮助,因为name不是主键。另请注意,您根本无法防止冲突(至少在不使用某些特定于 DBMS 的功能的情况下),因为基本上它是写入倾斜异常的一个示例,在基于 MVCC 的 DBMS 中无法防止冲突。

另外,如果导入 XML 文件的原子性并不重要,您可以将长事务分成几个较短的事务,并在违反约束的情况下简单地重试它们。