我与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
我无法访问。
答案 0 :(得分:2)
每个连接/会话都为自己确定了它愿意忍受的肮脏程度。没有办法让一个不同的连接突然强制连接看到更脏的数据(或相反,更严格)
SELECT
具有对其自身锁定/阻止行为的所有控制权。并且UPDATE
总是必须应用一些独占锁才能成功完成。因此,如果您无法更改SELECT
,那么您无法克服目前的情况。
答案 1 :(得分:0)
在另一个WITH(NOLOCK)
上尝试SELECTS
子句。该子句将读取脏数据。
实施例
SELECT ....
FROM <tablename> WITH(NOLOCK)
WHERE ......
更多信息here
编辑: 顺便说一句,设置隔离级别ReadUncommited会使当前事务读取未提交的数据,它不会控制当前范围的事务的隔离级别。