gpt4 book ai didi

sql-server - 在读取未提交的查询后,我是否必须将其设置回已提交?

转载 作者:行者123 更新时间:2023-12-03 00:03:18 25 4
gpt4 key购买 nike

想象一下使用与此处类似的代码执行查询:

using (SqlConnection TheConnection = GetSqlConnectionNoCatch(SQLConnectionStr))
using (SqlDataAdapter TheDataAdapter = new SqlDataAdapter(SQLStatement, TheConnection) { MissingSchemaAction = SchemaAction })
{
DataSet TheDataSet = new DataSet();
TheDataAdapter.SelectCommand.CommandTimeout = SQLTimeout;
TheDataAdapter.Fill(TheDataSet, TableName);

return TheDataSet;
}

想象一下,必须读取一个数据库表,该表绝对会受到写入的冲击,不间断,这会导致大量死锁和失败,因此您必须使用读取未提交隔离级别来执行读取。

如果我的正常查询是:

SELECT Field1, Field2 FROM Table WHERE some_type_of_clause

我经常看到您将其更改为:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT Field1, Field2 FROM Table WHERE some_type_of_clause

好的,这就是我问这个问题的原因,这个特定的链接:http://blog.sqlauthority.com/2011/04/17/sql-server-applying-nolock-hint-at-query-level-nolock-for-whole-transaction/

他的示例如下:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT *
FROM AdventureWorks.Sales.SalesOrderDetail sod
INNER JOIN AdventureWorks.Sales.SalesOrderHeader soh ON
sod.SalesOrderID = soh.SalesOrderID
ORDER BY sod.ModifiedDate
-- Set isolation level to original isolation level
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

我是否也需要在查询结束时将其设置回 READ COMMITTED?或者我的未提交读取仅适用于该查询?或者也许是连接的生命周期(检查我的代码意味着一旦我返回数据集,我的连接就会立即关闭)?

网络上的大多数示例都省略了“将其设置回原始隔离级别”,因此他将其包含在内让我感到困惑。谢谢!

最佳答案

这里的答案可能会有所帮助:WITH (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

事务隔离级别是连接级别设置。这意味着任何嵌套存储过程调用等都将使用新的隔离级别设置,但来自同一用户的其他用户/查询窗口/ session 将使用适用的默认值(或最后设置的任何值)。

在您的情况下,您不需要将隔离级别设置回已提交,除非您有其他语句或数据集要返回,而这些语句或数据集稍后不应在同一 session 中使用未提交。重置只是一个很好的做法。

关于sql-server - 在读取未提交的查询后,我是否必须将其设置回已提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16740037/

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