我有一个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事务和隔离级别来实现相同的结果。我不能为我的生活,弄清楚如何做到这一点。它是否可能,或者此行级锁定仅适用于数据库级别?