我认为NHibernate是一个相当常见的用例。我创建一个实体并尝试使用ISession.Save()后跟Transaction.Commit()来保存它。在这一点上,我希望违反诸如唯一/主键约束之类的东西作为例外。然而,我所看到的只是一个GenericADOException。这并不能帮助我区分真正的数据库故障,而不是要求用户为实体选择另一个名称来保持唯一性。
目前,我已经实施了首先查询的丑陋的解决方法,以确保不会违反约束。这只是一个等待发生的竞争条件,我真的不希望用户看到“糟糕,数据库做了一些有趣的事情!也许你应该再试一次。”一种消息。
有没有一种优雅的方法来解决这个问题?
答案 0 :(得分:0)
NHibernate并不知道约束(并且很难在一开始就强制执行唯一约束),因此处理这个问题在很大程度上取决于你。我认为你在正确的轨道上有一个查询来检查该值是否存在,但正如你所提到的,这留下了另一个进程/线程首先插入值的可能性。该方法的解决方案是独占锁,但当然您必须考虑该锁的含义。我不知道NHibernate的锁定方法是如何工作的,但如果它们不提供你需要的东西,你总是可以访问连接并使用原始SQL。