Nhibernate 保存时检查重复项

Nhibernate 保存时检查重复项,nhibernate,duplicates,unique,Nhibernate,Duplicates,Unique,如何在保存新对象时检查重复项 情景: 在没有重复项执行保存时,通过某些查询->检查重复项 不好,因为在检查和保存之间,有足够的时间让其他用户插入具有相同数据的新对象(用户活动频繁) 我应该在保存时检查异常还是什么?使用(var tx=session.BeginTransaction(IsolationLevel.Serializable)) using (var tx = session.BeginTransaction(IsolationLevel.Serializable)) {

如何在保存新对象时检查重复项

情景:

  • 在没有重复项执行保存时,通过某些查询->检查重复项
不好,因为在检查保存之间,有足够的时间让其他用户插入具有相同数据的新对象(用户活动频繁)

我应该在保存时检查异常还是什么?

使用(var tx=session.BeginTransaction(IsolationLevel.Serializable))
using (var tx = session.BeginTransaction(IsolationLevel.Serializable))
{
    bool alreadyExists = session.Query<MyEntity>()
                                .Any(x => x.UniqueProp = newEntity.UniqueProp);
    if (!alreadyExists)
        session.Save(newEntity)
    tx.Commit();
}
{ bool alreadyExists=session.Query() .Any(x=>x.UniqueProp=newEntity.UniqueProp); 如果(!alreadyExists) session.Save(新实体) tx.Commit(); }
Serializable
隔离级别保证任何人都不能在查询和插入之间插入匹配的行。当然,缺点是由于范围锁而降低了并发性


处理异常是另一种选择。

“用户活动频繁”将取消此解决方案的资格:(@dario-g:不,不是。只有冲突频繁时才有问题。这取决于数据库,但SQL Server使用范围锁,而不是表锁进行序列化(确保您有适当的索引)是的-理论上,但实际上不同-应用程序变慢:(@dario-g:你试过了吗?唯一的选择是捕获和解码异常。尝试类和属性级别的乐观锁属性。不过我不确定它是否会影响插入。