配置隔离级别以在更新数据时允许ReadUncommited

时间:2013-12-18 13:14:11

标签: c# sql .net transactions isolation-level

我与SqlConnection.BeginTransaction()开始交易,我执行DELETE和一些INSERT。我可以在隔离级别进行任何配置,以允许任何查询在事务期间以“脏路”读取数据吗?

基本上我想在更新数据时防止锁定。问题是;我无法控制SELECT。如果我在我的事务上定义ReadUncommited隔离级别,外部查询是否有权在不等待的情况下读取数据,或者需要在此查询中定义它?

例如:

try
{                         
   connection.Open();
   transaction=connection.BeginTransaction(IsolationLevel.ReadUncommited);            

   // DELETE
   foreach (int i in fibarray)
   {
       // INSERTS
   }
   transaction.Commit();
}
catch (Exception ex)
{
   if (transaction.Connection != null)
       transaction.Rollback();
}             

与此同时,另一台机器上的SELECTS我无法访问。

2 个答案:

答案 0 :(得分:2)

每个连接/会话都为自己确定了它愿意忍受的肮脏程度。没有办法让一个不同的连接突然强制连接看到更脏的数据(或相反,更严格)

SELECT具有对其自身锁定/阻止行为的所有控制权。并且UPDATE总是必须应用一些独占锁才能成功完成。因此,如果您无法更改SELECT,那么您无法克服目前的情况。

答案 1 :(得分:0)

在另一个WITH(NOLOCK)上尝试SELECTS子句。该子句将读取脏数据。

实施例

SELECT ....
FROM <tablename> WITH(NOLOCK) 
WHERE ......

更多信息here

编辑: 顺便说一句,设置隔离级别ReadUncommited会使当前事务读取未提交的数据,它不会控制当前范围的事务的隔离级别。