TransactionScope中代码的奇怪行为?

时间:2010-03-26 15:39:40

标签: wcf multithreading ado.net transactions

我们在生产应用程序中遇到了一个非常复杂的问题。

  1. 我们有一个WCF方法,它在数据库中创建一个复杂的实体及其所有关系。

    public void InsertEntity(Entity entity)
    {
       using(TransactionScope scope = new TransactionScope())
       {
           EntityDao.Create(entity);
       }    
    }
    
  2. EntityDao.Create(entity)方法非常复杂,并且具有巨大的逻辑。在整个创建过程中,它会创建多个子实体,并且还会对数据库进行多次查询。

  3. 在实体创建的整个WCF请求期间,通常Connection在ThreadStatic变量中维护并由DAO重用。虽然步骤2中描述的DAO中的某些查询使用新连接并在使用后将其关闭。

  4. 总的来说,我们已经看到上述过程行为不稳定。内部DAO中的一些查询甚至不返回数据库中的实际数据?运行到actaul数据存储时的相同查询会给出正确的结果。

    这种行为的可能原因是什么?

1 个答案:

答案 0 :(得分:0)

不建议使用ThreadStatic。请改用CallContext。我在http://code.google.com/p/softwareishardwork/处有代码,它以您描述的方式(在严重的高性能方案中测试)演示处理连接的正确方法。使用此代码尝试测试用例。