控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

Entity Framework with NOLOCK

作者:未知 出处:cnblog 2013年07月09日 阅读:

 在SqlServer中,频繁在同一个数据库表同时进行读写的时候,会存在锁的问题,也就是在前一个insert、update、delete事务操作完毕之前,你不能进行读取,必须要等到操作完毕,你才能进行select操作,目的是为了防止并发操作而读到脏数据,在SQL语句中,如果能容忍这种情况、加快查询速度,可以忽略锁进行查询:

 
select * from [User] with(nolock) 但是如果你项目中使用EntityFramework,可以使用下面这段代码进行nolock查询:需要添加System.Transactions程序集的引用
//declare the transaction options
var transactionOptions = new System.Transactions.TransactionOptions();
//set it to read uncommited
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
//create the transaction scope, passing our options in
using (var transactionScope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, transactionOptions))
{
    //declare our context
    using (var context = new MyEntityConnection())
    {
        //any reads we do here will also read uncomitted data
        //...
        //...
    }
    //don't forget to complete the transaction scope
    transactionScope.Complete();
}
改进,如果项目里有多处地方都需要nolock查询,这段代码就需要不断的拷贝了,这时候需要考虑进行封装,很明显,外层代码可以很容易的抽出来,但是,里面的代码段是不确定的,如果封装的话,执行的时候,就需要传一个代码片段进去,委托在这种情况就派上用场了,我们可以使用委托来改进一下,也就是查询数据库时候的逻辑代码代由委托传递进去。
 
 
        public static void NoLockInvokeDB(Action action)
        {
            var transactionOptions = new System.Transactions.TransactionOptions();
            transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
            using (var transactionScope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, transactionOptions))
            {
                try
                {
                    action();
                }
                finally
                {
                    transactionScope.Complete();
                }
            }
        }使用的时候也很简单:
NoLockInvokeDB(() =>{
   using (var db = new TicketDB())
   {
      lst = db.User.ToList();
   }
});
 
如果你不太习惯Action这种微软高度封装的委托的写法(其本质就是委托),可以继续看下去原始委托的写法:(我个人一直的观点是,微软喜欢搞高度封装的东西,想让程序员提高编程工作效率,但是,初入门的程序员因为不知道其中的原理,只会使用,所以就成了真真正正的代码农民工,所以,我们在工作学习的过程中,不要因为使用而使用,多去探讨其本质实现,对自己的提高有帮助。)
 
 
  public class Helper
    {
        public void NoLockInvokeDB(EFdelegate d)
        {
            var transactionOptions = new System.Transactions.TransactionOptions();
            transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
            using (var transactionScope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, transactionOptions))
            {
                d();
                transactionScope.Complete();
            }
        }
    }
    public delegate void EFdelegate();调用也非常简单
 
 EFdelegate d = new EFdelegate(() => {
                //这里写传递的代码段
            });如果不习惯这种匿名函数的写法的话,那就写全了。
 
 
protected void Page_Load(object sender, EventArgs e)
{
    EFdelegate d = new EFdelegate(SonFun);
}
 
public void SonFun()
{
 //这里写传递的代码片段
}

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统