NHibernate 中的非锁定事务
本文关键字:锁定 事务 NHibernate | 更新日期: 2023-09-27 18:37:07
我需要在生产环境中执行一个长时间运行的进程(请不要问为什么),我正在使用 ReadUncommit 在这个进程中打开一个事务,但它锁定了所有涉及的表,我确实在表上运行了一些更新。因此,当我运行此过程,然后尝试对其中任何一个表运行查询时,由于锁定,查询超时。
无论如何,我的交易不会锁定表吗?如果我不使用事务,则表不会锁定。
这是我的代码
ISession session = sessionProvider.GetCurrentSession();
session.SetBatchSize(100);
session.BeginTransaction(IsolationLevel.ReadUncommitted);
var solrCandidateFactory = _container.GetInstance<ISolrCandidateFactory>();
int id;
while (concurrentQueue.TryDequeue(out id))
{
var cv = session.Get<Curriculum>(id,LockMode.None);
SolrCandidate fromCandidate = solrCandidateFactory.CreateFromCandidate(cv);
_candidateIndexer.Index(fromCandidate);
session
.CreateSQLQuery("update Curriculum set IndexedAt = :time where Id = :id")
.SetParameter("time", DateTime.Now)
.SetParameter("id", id)
.ExecuteUpdate();
}
session.Transaction.Commit();
锁定可能是 Sql Server 锁定升级的结果。我建议你将事务分解成更小的批次,在一个事务中只索引 50-100 个实体,提交它,在另一个事务中索引下一批。
顺便说一下,ISession 不用于批处理,与 IStatelessSession 相比,它会消耗更多的内存。
我认为在这种事务中使用 ReadUncommit 不是一个好主意。对于非关键只读事务(如用于显示目的的列表),ReadUncommit 可能没问题。没有非锁定交易这样的东西。