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:你试过了吗?唯一的选择是捕获和解码异常。尝试类和属性级别的乐观锁属性。不过我不确定它是否会影响插入。