我有一个 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 操作中所做的更改。
也就是说,我检索具有由 SQL 应用的 UPDLOCK、ROWLOCK 的 SecurityAssignment 表行列表,并且针对这些行的后续查询在该更新锁被释放之前不会返回 - 因此测试中的 foregroundResult 包括在背景线程。
这一切都很好。
现在,我想对与数据库无关的 SQL 做同样的事情,使用 OleDb 事务和隔离级别来实现相同的结果。我不能为我的生活,弄清楚如何去做。甚至有可能,还是这种行级锁定仅适用于数据库级别?