Jus*_*ing 5 sql-server transaction-isolation sql-server-2008
想象一下,使用类似于此处的代码执行查询:
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;
}
Run Code Online (Sandbox Code Playgroud)
并且想象一下,必须读取数据库表,这些数据表绝对会受到攻击,不间断,写入会导致大量死锁和失败,因此您必须使用Read Uncommitted Isolation级别执行读取操作.
如果我的正常查询是:
SELECT Field1, Field2 FROM Table WHERE some_type_of_clause
Run Code Online (Sandbox Code Playgroud)
我经常看到你会把它改成:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT Field1, Field2 FROM Table WHERE some_type_of_clause
Run Code Online (Sandbox Code Playgroud)
好的,所以这就是让我问这个问题的原因,这个特殊的链接:http://blog.sqlauthority.com/2011/04/17/sql-server-applying-nolock-hint-at-query-level-nolock-换整个事务/
他的例子如下:
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
Run Code Online (Sandbox Code Playgroud)
我是否还需要在查询结束时将其设置回READ COMMITTED?或者我的读取未提交仅适用于那个查询?或者也许连接的生命(检查我的代码将意味着我一返回DataSet,因为我的Connection正好关闭)?
网上的大多数例子都没有将"设置回原始隔离级别",所以我把它包括在内让我感到困惑.谢谢!
这里的答案可能会有所帮助:WITH(NOLOCK)vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
事务隔离级别是连接级别设置.这意味着任何嵌套的存储过程调用等都将使用您的新隔离级别设置,但来自同一用户的其他用户/查询窗口/会话将使用适用的默认值(或最后设置的任何内容).
在您的情况下,您不需要将隔离级别设置回已提交,除非您有其他要返回的语句或数据集,以后不应在同一会话中使用uncommited.重置只是一种很好的做法.
| 归档时间: |
|
| 查看次数: |
5657 次 |
| 最近记录: |