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()等。
{
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()等。
相关文章推荐
- golang实现并发数控制的方法
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- jQuery事件 mouseover方法与mouseout方法实现鼠标移进显示移出消失的效果 (css控制span标签)
- 使用async、enterproxy控制并发数量的方法详解
- AJAX在静态页面中实现权限控制的方法参考
- Java高并发程序-Chapter3 JDK并发包(第十七讲)同步控制之ReentrantLock 的实现
- SE高阶(4):多线程(并发)—①创建启动方式和控制线程方法
- java并发(二)线程安全的实现方法
- 静态工具方法的并发控制
- php结合redis高并发下发帖、发微博的实现方法
- PHP使用Redis实现防止大并发下二次写入的方法
- C#中在控件中画图并用TIMER控件进行控制方法的实现
- 用同义词控制对象权限实现方法
- jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
- react router4+redux实现路由权限控制的方法
- 库存数量控制中储备定额方法的改进与实现
- node 使用 async 控制并发的方法
- pymongo实现控制mongodb中数字字段做加法的方法
- jQuery使用slideUp方法实现控制元素缓慢收起
- java并发编程(九)--并发编程中实现内存可见的两种方法比较:加锁和volatile变量