Блокировка обновления на уровне строк с использованием System.Transactions - PullRequest
2 голосов
/ 15 ноября 2010

У меня есть процедура 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 - это действие, которое обновляет строки в таблице, например:

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

Тогда значение foregroundResults, возвращаемое тестом, должно отражать изменения, внесенные в действие backgroundWork.

То есть, я получаю список строк таблицы SecurityAssignment, к которым применяется SQL UPDLOCK, ROWLOCK, и последующие запросы к этим строкам не возвращаются до тех пор, пока не будет снята эта блокировка обновления - таким образом, в тест foregroundResult включены обновления сделано в фоновом режиме темы.

Это все отлично работает.

Теперь я хочу сделать то же самое с независимым от базы данных SQL, используя транзакции OleDb и уровни изоляции для достижения того же результата. И я не могу ради своей жизни понять, как это сделать. Это вообще возможно, или эта блокировка на уровне строк применяется только на уровне БД?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...