gpt4 book ai didi

sql-server-2008 - 在未提交读的情况下使用 TransactionScope - SQL 中的 with (nolock) 是否必要?

转载 作者:行者123 更新时间:2023-12-02 06:12:43 25 4
gpt4 key购买 nike

我正在使用 FluentNHibernate,并且有一个记录列表,映射到 SQL Server 2008 View 。脏读对我来说没问题,优先考虑的是不锁定表。

View 内的 SQL 查询没有任何 with (nolock),但是,我使用以下方法...

using (var txScope = new TransactionScope(TransactionScopeOption.Suppress, new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted })){   ... The reading of records from the view is done here, through Fluent NHibernate...}

将应用程序层的隔离级别设置为未提交读取,是否将 (nolock) 应用于该上下文中生成的查询?

最佳答案

简短回答:否

长答案:

仅定义 TransactionScope 并不定义将在事务内调用任何读取或写入。

要在事务中运行某些内容,您仍然必须打开并提交事务!

TransactionScope 的 TimeoutIsolationLevelTransactionOptions 仅定义在该事务中创建的任何事务的默认值没有明确设置这些选项的范围。实际上,TransactionScope 确实创建了一个事务,但如果不打开一个新事务,它就不会处于事件状态。在内部,这将执行一些复杂的操作,克隆事务等...所以让我们忽略这一点...

如果没有事务,您就无法定义隔离级别,任何 select 语句都将以 IsolationLevel.ReadCommissed 运行,因为这是 SQL Server 的默认设置。

您还可以查询session.Transaction.IsActive以查看 session 当前是否有事件事件!

让我们看一下下面的代码,我添加了一些注释以使其更清晰

using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions()
{
IsolationLevel = IsolationLevel.ReadUncommitted
}))
{

using (var session = sessionFactory.OpenSession())
{
// outside any transaction...
var x = session.Transaction.IsActive; // false;

// read will be done with SQL Server default (ReadCommited)
var pp = session.Query<Page>().Where(p => p.Photos.Count() > 1).ToList();

using (var transaction = session.BeginTransaction())
{
// will use ReadUncommitted according to the scope
var y = session.Transaction.IsActive; // true;

var p1 = session.Get<Page>(1);

transaction.Commit();
}
using (var transaction = session.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
{
// will use ReadCommitted according to the transaction initialization
var y = session.Transaction.IsActive; // true;

var p1 = session.Get<Page>(1);

transaction.Commit();
}

scope.Complete();
}
}

您还可以使用 SQL Server Profiler 观察 SQL Server 对这些设置的 react 。

只需创建一个新的跟踪并留意 Audit Login 事件,该事件的文本将包含隔离级别,您可以看到它实际上执行了Audit Login code> 每次创建交易时,例如

 set transaction isolation level read uncommitted

--

如果此信息有任何错误,请纠正我,我只是自己想出来的,因此可能存在失败的可能性;)

关于sql-server-2008 - 在未提交读的情况下使用 TransactionScope - SQL 中的 with (nolock) 是否必要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19090860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com