2011-04-26 95 views
1

是否有此代码的任何副作用:NOLOCK默认为每个请求创建一个ObjectContext的为EF4


///This code runs per request 
public static MyObjectContext CreateEntity() 
{ 
    MyObjectContext db=new MyObjectContext(); 

    db.Connection.Open(); 
    var con = (SqlConnection)((EntityConnection)hi.Connection).StoreConnection; 
    SqlCommand cmd = new SqlCommand("set transaction isolation level read uncommitted",con); 
    cmd.ExecuteNonQuery(); 

    return db; 
} 

现在“DB”的实例将运行ReadUncommited模式?

回答

0

副作用是,您必须手动处理您的连接,并且连接在整个生命周期内都由上下文保存。它也在整个生命周期内保持打开状态,效率较低。

另一个副作用是读取未完成的隔离级别本身,使用相当危险,因为它允许读取未被取消的事务数据。

为什么你需要这个? EF默认使用数据库服务器的默认事务隔离模式。对于SQL服务器,它被读取提交。 EF在默认情况下不会保留记录上的锁定,因为每个读取操作只是一个事务的一部分,持续时间仅限于读取。只有SaveChanges将事务用于多个数据库命令。

+0

我有一张表(User_Notification)。该表具有沉重的插入负载。 – 2011-04-26 17:18:44

+0

那么只有在访问这个表时才使用read uncommited呢? – 2011-04-26 17:35:31

+0

现在我已经在同一个问题上挣扎了好几个小时。我们的数据库团队坚持将隔离级别设置为READ UNCOMMITTED。我正在使用存储命令在上下文级别执行此操作。但是,后续查询失败给我以下错误。 '您只能在READ COMMITTED或REPEATABLE READ隔离级别中指定READPAST锁。'有些查询默认使用READPAST锁,并且我没有在分析器中看到该查询。有任何想法吗? – Praveen 2011-04-27 01:31:38

相关问题