我有一个非常重要的问题需要帮助。我将尝试将问题简化为以下示例:
有一个 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();
}
}
}
有 2 种不同的方法可以将基于事务的记录(具有默认隔离级别的ADO.NET SQLTransaction )插入数据库中的一个“特定表”(当然,不同线程随时调用)。
从示例中可以看出,第一种方法只插入简单的'type1'记录,但第二种方法插入大量的'type2'记录,以一些'BEGIN'和'END'标识符开头,因此这串可以是稍后由另一个应用程序整体处理。
由于所有记录都具有自动增量 ID,因此我的意图是在此表中在'BEGIN' 和 'END'之间只有'type2' 的记录。
问题是:在这个表中,在“ BEGIN”和“END”记录之间,是否有可能出现“type1”的滑动记录?
AFAIK 数据库应该在该事务期间被锁定(默认隔离级别),通常这种行为不应该发生,所以我的实现应该是正确的。这是正确的还是我错过了一些重要的事情?
非常感谢!