Nhibernate .SaveOrUpdate,如果行是否更新,如何获取,意味着RowCount

时间:2018-06-15 00:50:13

标签: sql-server nhibernate

我正在更新SQL表中的列,我想检查它是否已成功更新或已经更新,我的查询没有做任何事情 因为我们在SQL Server中获得@@rowcount

在我的情况下,我想更新名为lockForProcessing的列,所以如果它已经处理,那么我的查询不会影响任何行,这意味着其他人已经在处理它,否则我会处理它

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您的问题与多线程/并发问题有关,同一个表可能会同时更新。

你可能想看一下: Chapter 11. Transactions And Concurrency

  • ISession不是线程安全的!
  • 执行代码 session.SaveOrUpdate()时,实体不会被存储,但在transaction.Commit()之后通常
  • 存储提交是两回事。
    • 在任何session.Flush()之后,实体存储。根据IsolationLevel,实体不会被其他交易看到。
    • 在transaction.Commit()之后,实体提交。提交也会刷新。

也许您需要做的就是在开始事务时选择正确的IsolationLevel,然后读取表行以获取当前值:

using (var transaction = session.BeginTransaction(IsolationLevel.Serializable))
        {
            session.Get(); // Read your row
            transaction.Commit();
        }

虽然在应用程序代码中创建一些锁定或管道机制可能更容易。如果不了解谁正在访问数据库(其他事务,会话,进程?),则很难更准确地回答。