2

I have a MSSQL procedure with the following code in it:

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

I'm trying to move that same behavior into a component that uses OleDb connections, commands, and transactions to achieve the same result. (It's a security component that uses the SecurityAssignment table shown above. I want it to work whether that table is in MSSQL, Oracle, or Db2)

Given the above SQL, if I run a test using the following code

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);

Where Subject.GetAssignmentsHavingUser runs the sql above and returns a collection of results and backgroundWork is an Action that updates rows in the table, like this:

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

Then the foregroundResults returned by the test should reflect the changes made in the backgroundWork action.

That is, I retrieve a list of SecurityAssignment table rows that have UPDLOCK, ROWLOCK applied by the SQL, and subsequent queries against those rows don't return until that update lock is released - thus the foregroundResult in the test includes the updates made in the backgroundThread.

This all works fine.

Now, I want to do the same with database-agnostic SQL, using OleDb transactions and isolation levels to achieve the same result. And I can't for the life of me, figure out how to do it. Is it even possible, or does this row-level locking only apply at the db level?

  • To clarify, I think I'm looking for the right isolation level/transaction scope to apply in both the Subject.GetAssignmentsHavingUser method and the test where it enlists in transactionScope – indomitablehef Nov 15 '10 at 16:53

0 Answers0