Nhibernate .SaveOrUpdate,如何获取行是否更新,表示RowCount
Nhibernate .SaveOrUpdate, how to get if row was update or not, means RowCount
我正在更新 SQL table 中的一列,我想检查它是否已成功更新或已经更新但我的查询没有执行任何操作
当我们在 SQL 服务器中获得 @@rowcount
时。
在我的例子中,我想更新一个名为 lockForProcessing
的列,所以如果它已经在处理中,那么我的查询不会影响任何行,这意味着其他人已经在处理它,否则我会处理它。
如果我没理解错的话,你的问题与多线程/并发问题有关,其中可能会同时更新相同的 table。
您可能想看看:
Chapter 11. Transactions And Concurrency
- ISession 不是线程安全的!
- 执行代码 session.SaveOrUpdate() 时不会存储实体,但 通常 在 transaction.Commit()。
- stored 和 commited 是两个不同的东西。
- 实体在任何 session.Flush() 之后 存储 。根据 IsolationLevel,实体不会被其他事务看到。
- 实体在 transaction.Commit() 之后 提交 。提交也会刷新。
也许您需要做的就是在开始事务时选择正确的 IsolationLevel,然后读取 table 行以获取当前值:
using (var transaction = session.BeginTransaction(IsolationLevel.Serializable))
{
session.Get(); // Read your row
transaction.Commit();
}
虽然在您的应用程序代码中创建一些锁定或管道机制可能更容易。如果不知道更多关于谁在访问数据库(其他事务、会话、进程?),就很难做出更准确的回答。
我正在更新 SQL table 中的一列,我想检查它是否已成功更新或已经更新但我的查询没有执行任何操作
当我们在 SQL 服务器中获得 @@rowcount
时。
在我的例子中,我想更新一个名为 lockForProcessing
的列,所以如果它已经在处理中,那么我的查询不会影响任何行,这意味着其他人已经在处理它,否则我会处理它。
如果我没理解错的话,你的问题与多线程/并发问题有关,其中可能会同时更新相同的 table。
您可能想看看: Chapter 11. Transactions And Concurrency
- ISession 不是线程安全的!
- 执行代码 session.SaveOrUpdate() 时不会存储实体,但 通常 在 transaction.Commit()。
- stored 和 commited 是两个不同的东西。
- 实体在任何 session.Flush() 之后 存储 。根据 IsolationLevel,实体不会被其他事务看到。
- 实体在 transaction.Commit() 之后 提交 。提交也会刷新。
也许您需要做的就是在开始事务时选择正确的 IsolationLevel,然后读取 table 行以获取当前值:
using (var transaction = session.BeginTransaction(IsolationLevel.Serializable))
{
session.Get(); // Read your row
transaction.Commit();
}
虽然在您的应用程序代码中创建一些锁定或管道机制可能更容易。如果不知道更多关于谁在访问数据库(其他事务、会话、进程?),就很难做出更准确的回答。