NHibernate并发问题

本文关键字:问题 并发 NHibernate | 更新日期: 2023-09-27 17:57:40

我有一个S#arp Architecture应用程序,它实现了一个轻量级的队列处理功能,通过该功能,各个线程从列表中提取实体,并设置它们的状态,以标记对这些项目的处理已经开始。

尽管在显式事务中封装了启动处理位并使用了C#锁(),但有时我仍然会让它们同时启动。

我后悔没有使用MSMQ吗。。。是的,但是现在这种并发行为让我感到困惑。很明显,我对NHibernate交易和刷新有些不了解。你能帮我吗?

以下是相关的代码位:

private static object m_lock = new object();
private bool AbleToStartProcessing(int thingId)
{
    bool able = false;
    try
    {
        lock (m_lock)
        {
            this.thingRepository.DbContext.BeginTransaction();
            var thing = this.thingRepository.Get(thingId);
            if (thing.Status == ThingStatusEnum.PreProcessing)
            {
                able = true;
                thing.Status = ThingStatusEnum.Processing;
            }
            else
            {
                logger.DebugFormat("Not able to start processing {0} because status is {1}",
                        thingId, thing.Status.ToString());
            }
            this.thingRepository.DbContext.CommitTransaction();
        }
    }
    catch (Exception ex)
    {
        this.thingRepository.DbContext.RollbackTransaction();
        throw ex;
    }
    if (able)
        logger.DebugFormat("Starting processing of {0}",
                        thingId);
    return able;
}

我本以为这可以保证一次只有一个线程可以更改"事物"的状态,但我经常在日志中看到这一点:

2011-05-18 18:41:23,557 thread41 DEBUG src:MyApp.Blah.ThingJob - Starting processing of 78090
2011-05-18 18:41:23,557 thread51 DEBUG src:MyApp.Blah.ThingJob - Starting processing of 78090

然后两个线程都试图对同一件事进行操作,结果造成了混乱。

我错过了什么?谢谢

edit:更改了代码以反映我的日志记录在真实版本中的工作方式

NHibernate并发问题

在NHibernate映射中设置并发,这篇文章应该会帮助您入门。

http://ayende.com/blog/3946/nhibernate-mapping-concurrency

我认为您只是对用于设置正在处理和检查是否已经在处理的状态感到困惑。集合ThingStatusNum.Processing中的第一个,但下一个家伙正在检查不同的东西-ThingStatueNum.PreProcessing。因为ThingStatuteNum.Processing!=ThingStatusNum.PreProcessing,您的锁定意味着两个线程不是