2011-01-26 81 views
2

我有一个数据库表,它有一个列上定义了一个唯一的约束。我也有一个多线程的消息处理系统。当消息被消费时,可能有时候两个消息包含具有相同值的相同实体(具有定义的唯一约束的列的值)。因此,在代码中,服务层首先使用这个唯一字段(通过hibernate命名查询)查询数据库,以查看是否有任何记录首先存在。如果不是,则它插入一条新记录。如果具有此唯一字段的记录已经存在,而不是插入记录,则会更新它并在另一个表中插入子记录。如何避免使用休眠时违反唯一约束?

我遇到了第二个线程认为该记录尚未存在的问题,因此它尝试插入它。但是,此时第一个线程已成功插入记录。所以异常会被抛出违反唯一约束。你能帮助什么是使用hibernate/oracle解决方案来处理这种情况的最佳方式?我需要某种锁定选项吗?谢谢。

+0

您声明您需要Oracle/Hibernate解决方案。是否有一个原因,你不能改变你的消息系统,因此它是同步的?听起来你已经编写了它的执行方式,所以你可以用这种方式处理它,而不是在Hibernate或Oracle中处理它。 – 2011-01-26 20:51:41

回答

1

在这种情况下试图避免回滚违背了MVCC(特别是由Oracle使用)的精神,因为它需要过度的锁定。

我认为最好通过启动另一个事务来执行更新来回滚插入。