助けが必要な非常に重要な質問があります。問題を次の例に落とし込もうとします。
次のように wcf/web サービスを実装します (ただし、他のモジュールにすることもできます)。
public class Svc: ISvc
{
public void PerformSimpleOperations()
{
try
{
// insert in other tables here (calling stored procs)
/* important line here */
dbHandler.InsertRecordInSpecificTable(recordType1);
// commit transaction (default isolation level)
dbHandler.CommitTransactDB();
}
catch
{
dbHandler.RollbackTransactDB();
}
}
public void PerformComplexOperations()
{
try
{
// some complex operations here involving db (calling stored procs)
/* important lines here */
dbHandler.InsertRecordInSpecificTable(recordBEGIN);
foreach (var recordType2 in arrayOfRecordsType2)
dbHandler.InsertRecordInSpecificTable(recordType2);
dbHandler.InsertRecordInSpecificTable(recordEND);
// commit transaction (default isolation level)
dbHandler.CommitTransactDB();
}
catch
{
dbHandler.RollbackTransactDB();
}
}
}
データベース内の 1 つの 'SpecificTable' にトランザクション ベース(デフォルトの分離レベルのADO.NET SQLTransaction) でレコードを挿入する 2 つの異なるメソッドがあります (もちろん、異なるスレッドによっていつでも呼び出されます)。
例でわかるように、最初のメソッドは'type1' の単純なレコードを挿入するだけですが、2 番目のメソッドはいくつかの 'BEGIN'および'END'識別子で始まる'type2' の大量のレコードを挿入するため、この束は後で別のアプリケーションによって全体として処理されます。
すべてのレコードには自動インクリメンタル ID があるため、私の意図は、このテーブルの'BEGIN' と 'END' の間に'type2' のレコードのみを含めることです。
質問: このテーブルで、' BEGIN'レコードと'END'レコードの間に、 'type1' のスリップ レコードがある可能性はありますか?
私の知る限り、そのトランザクション中はデータベースをロックする必要があり(デフォルトの分離レベル)、通常はこの動作は発生しないため、私の実装は正しいはずです。それは正しいですか、それともここで重要なことを見逃していますか?
どうもありがとう!