NHibernate实现并发控制的方法

有很多时候我们需要多 线程并发访问数据库,这样就存在访问冲突的问题,传统中的SQL可以用"for update"一类的语法实现数据锁定,在NHiberante里也有类似的实现方法,很简单,下面是一个例子方法,实现在事务里保证数据访问的独立性:
         private IList<MailInfo> Load( int first,  int count)
        {
            IList<MailInfo> list =  new List<MailInfo>();
             if (count ==  0return list;

            ISession session = DAORepository.Instrance.DbSession;
             using (ITransaction tx = session.BeginTransaction())
            {
                 try
                {
                    ICriteria cri = session.CreateCriteria( typeof(MailInfo));
                    cri.SetFirstResult(first);
                    cri.SetMaxResults(count);
                    cri.Add( new Expression.EqExpression( " Status ", ( int)MailStatusType.New));
                    cri.AddOrder(Expression.Order.Desc( " CreateTime "));
                    cri.SetLockMode(LockMode.UpgradeNoWait);
                    list = cri.List<MailInfo>();
                     foreach (MailInfo mi  in list)
                    {
                        mi.Status = ( int)MailStatusType.Lock;
                        session.Update(mi);
                    }
                    tx.Commit();
                }
                 catch (Exception ex)
                {
                    tx.Rollback();
                     string err = ex.Message;
                }
                 finally
                {
                    session.Close();
                }
            }
             return list;
        }
该方法实现了"select top "+count+" * from MailInfo where Status="+(int)MailStatusType.New+" Order by CreateTime"查询功能,代码里实现锁定的就是这一句:
cri.SetLockMode(LockMode.UpgradeNoWait);
用于条件查询时,还有其他的锁定如session.Lock()等。

你可能感兴趣的:(Hibernate)