У меня есть процедура 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 и уровни изоляции для достижения того же результата. И я не могу ради своей жизни понять, как это сделать. Это вообще возможно, или эта блокировка на уровне строк применяется только на уровне БД?