需要使用linq的Dbml文件的建议,我们有大量数据的数据库。有时表中有锁。因此,我们需要在dbml类上应用带有未限制读取的隔离级别(我们知道这种隔离级别的一些缺点)。
我在dbml文件中有下面的苹果代码作为部分类
partial class MainDataContext
{
public MainDataContext()
{
base.Connection.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);
}
}
这是一种正确的实施方式吗?或者给出任何关于它的halpfull建议。
感谢
如果您这样做,您将需要将事务附加到该连接上的每个命令,这不是LINQ to SQL将为您做的事情(尽管有一些方法可以让它了解事务实例)。也许一种选择是使用接受连接的重载,并简单地提供一个已经打开的连接,您已经通过在该连接上踩踏了隔离级别
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
当然,如果你这样做了,那么现在你的工作就是在完成后正确处理连接:LINQ to SQL将假设你在管理连接生存期。
LINQ到SQL数据上下文的另一个选项是使用ExecuteQuery<T>(sql, args)
方法,它允许您传入自己的原始TSQL-这显然意味着您不再真正使用LINQ,但它允许您在一些有战术意义的地方添加NOLOCK
等(仅使用物化器的数据上下文)。这更细粒度,并允许您专注于高吞吐量/高并发性的表。
您可以将与数据库交互的代码放置在TransactionScope
块中,并为TransactionScope设置所需的隔离级别。
TransactionOptions _transactionOptions = new TransactionOptions() { IsolationLevel = IsolationLevel.Snapshot };
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, _transactionOptions))
{
//your code here
}
当然,更进一步,你可以将transactionScope的创建封装在一个类似工厂的静态方法中,这样无论在哪里需要它都会更容易,如果你想更改隔离级别,就会有一个单独的地方可以更改它。根据你的要求,选择最适合你的。