次のコードを含む 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 アクションで行われた変更を反映する必要があります。
つまり、SQL によって UPDLOCK と ROWLOCK が適用された SecurityAssignment テーブルの行のリストを取得し、それらの行に対する後続のクエリは、その更新ロックが解放されるまで返されません。したがって、テストの foregroundResult には、背景スレッド。
これはすべてうまくいきます。
ここで、データベースに依存しない SQL で同じことを行い、OleDb トランザクションと分離レベルを使用して同じ結果を達成したいと考えています。そして、私は私の人生でそれを行う方法を理解することはできません。それは可能ですか、またはこの行レベルのロックはデータベースレベルでのみ適用されますか?