您的位置:首页 > 其它

NHibernate实现并发控制的方法(转)

2012-02-07 10:38 225 查看
有很多时候我们需要多线程并发访问数据库,这样就存在访问冲突的问题,传统中的SQL可以用"for update"一类的语法实现数据锁定,在NHiberante里也有类似的实现方法,很简单,下面是一个例子方法,实现在事务里保证数据访问的独立性: private IList<MailInfo> Load(int first, int count)
{
IList<MailInfo> list = new List<MailInfo>();
if (count == 0) return 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()等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: