有很多时候我们需要多线程并发访问数据库,这样就存在访问冲突的问题,传统中的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()等。
posted @ 2012-02-07 10:38 Byrd 阅读(20) 评论(0) 编辑