如何在实体框架上使用NOLOCK
函数?XML是做到这一点的唯一方法吗?
发布于 2009-09-23 16:13:16
不能,但您可以启动事务并设置isolation level to read uncommited。这基本上与NOLOCK相同,但它不是在每个表的基础上执行,而是针对事务范围内的所有内容执行。
如果这听起来像你想要的,下面是你如何去做的…
//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();
}
发布于 2013-09-01 07:33:17
扩展方法可以使这一切变得更容易
public static List<T> ToListReadUncommitted<T>(this IQueryable<T> query)
{
using (var scope = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions() {
IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
{
List<T> toReturn = query.ToList();
scope.Complete();
return toReturn;
}
}
public static int CountReadUncommitted<T>(this IQueryable<T> query)
{
using (var scope = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions() {
IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
{
int toReturn = query.Count();
scope.Complete();
return toReturn;
}
}
发布于 2013-04-10 21:42:07
如果你需要更多的东西,我们发现比每次实际启动一个事务作用域更少侵入性的最好方法是,在创建对象上下文之后,通过运行这个简单的命令来简单地设置连接上的默认事务隔离级别:
this.context.ExecuteStoreCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");
http://msdn.microsoft.com/en-us/library/aa259216(v=sql.80).aspx
通过这种技术,我们能够创建一个简单的EF提供程序,它为我们创建上下文,并在每次运行所有上下文时实际运行此命令,因此默认情况下我们始终处于“读取未提交”状态。
https://stackoverflow.com/questions/926656
复制相似问题