【问题标题】:Check for duplicates when saving保存时检查重复项
【发布时间】:2011-03-21 11:37:09
【问题描述】:

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

场景:

  • 通过某些查询检查重复项 -> 当没有重复项执行保存时

不好,因为在 checksave 之间有足够的时间其他用户可以插入新的具有相同数据的对象(用户活跃度高)。

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

【问题讨论】:

  • 试试类和属性级别的乐观锁属性。我不确定它会影响插入。

标签: nhibernate duplicates unique


【解决方案1】:
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();
}

Serializable 隔离级别保证没有人可以在查询和插入之间插入匹配的行。当然,缺点是由于范围锁而降低了并发性。

处理异常是另一种选择。

【讨论】:

  • “用户活跃度高”取消此解决方案的资格。 :(
  • @dario-g:不,它没有。如果碰撞频繁,这只是一个问题。这取决于数据库,但 SQL Server 例如使用范围锁,而不是可序列化的表锁(确保您有适当的索引)
  • 是的 - 在理论上,但在实践中是不同的 - 应用程序变慢:(
  • @dario-g:你试过了吗?唯一的选择是捕获和解码异常。
猜你喜欢
  • 2012-11-23
  • 1970-01-01
  • 2014-09-03
  • 2012-06-04
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多