使用System.Transactions进行行级更新锁定

时间:2010-11-15 16:51:56

标签: ado.net concurrency oledb system.transactions pessimistic-locking

我有一个MSSQL过程,其中包含以下代码:

SELECT Id, Role, JurisdictionType, JurisdictionKey
FROM 
    dbo.SecurityAssignment WITH(UPDLOCK, ROWLOCK)
WHERE Id = @UserIdentity

我正在尝试将相同的行为移动到使用OleDb连接,命令和事务的组件中以实现相同的结果。 (它是一个使用上面显示的SecurityAssignment表的安全组件。我希望它能用于表,无论该表是在MSSQL,Oracle还是Db2中)

鉴于上述SQL,如果我使用以下代码运行测试

Thread backgroundThread = new Thread(
    delegate()
      {
        using (var transactionScope = new TrasnsactionScope())
        {
          Subject.GetAssignmentsHavingUser(userIdentity);
          Thread.Sleep(5000);
          backgroundWork();
          transactionScope.Complete();
        }
     });
backgroundThread.Start();

Thread.Sleep(3000);
var foregroundResults = Subject.GetAssignmentsHavingUser(userIdentity);

其中    Subject.GetAssignmentsHavingUser 运行上面的sql并返回结果集合,backgroundWork是一个更新表中行的Action,如下所示:

delegate
  {
    Subject.UpdateAssignment(newAssignment(user1, role1));
  }

然后测试返回的foregroundResults应该反映在backgroundWork操作中所做的更改。

也就是说,我检索具有UPDLOCK,由SQL应用的ROWLOCK的SecurityAssignment表行的列表,并且在释放该更新锁之前不会返回针对这些行的后续查询 - 因此测试中的foregroundResult包含更新在后台制作线程。

一切正常。

现在,我想对数据库无关的SQL做同样的事情,使用OleDb事务和隔离级别来实现相同的结果。我不能为我的生活,弄清楚如何做到这一点。它是否可能,或者此行级锁定仅适用于数据库级别?

0 个答案:

没有答案