1

我们有一个在事务范围内运行的测试。我们最后处理事务范围以避免更改数据库。是否有可能将事务范围与在存储过程中提交事务结合起来?

这在大多数情况下工作正常。

但是,当我们使用实体框架来执行一个存储过程,其中包含一个事务,这是在存储过程中提交的。我们得到以下错误:

“分布式事务完成无论是在一个新的事务或NULL事务中登记本次会议\ r \ n”个

是犯有内部交易可以合并事务范围存储在程序?

回答

6

虽然你可能或可能无法解决这个问题,但我建议避免它完全可能是一个更好的选择。正如你所看到的,根据一个事务来保证你的数据库处于一个特定的状态并不总是有效。另外,因为您正在使用到数据库的多个连接,所以您已经自动提升了分布式事务中发生的任何事务 - 这可能是微妙的区别,但它会改变测试的性质。您最终可能会编写代码来克服分布式事务的特殊限制,否则这些限制将不再需要。

更好的策略是 - 对于单元测试,无论如何 - 模拟数据库依赖性,使用内存中的模拟对象或假对象代替数据库。我为LINQ to SQL做了类似的事情(请参阅我的blog entry关于此主题)对于集成测试,我认为您最好使用测试实例并编写设置代码,以便在每次测试之前将DB的状态重新初始化为已知值比引入额外的交易来清理东西。这样,如果您的清理代码在测试中失败,则不会影响正在运行的其他测试。

+0

如果可以的话,我会给这两张票。 – 2009-09-23 13:28:18

1

我用下面的代码的SP内部处理环境,其中一个交易可能或力可能不是当前: -

DECLARE @InTran int 

Set @InTran = @@TRANCOUNT 

IF @InTran = 0 BEGIN TRANSACTION 

/* Stuff happens */ 

IF @InTran = 0 AND @@TRANCOUNT > 0 COMMIT TRANSACTION 

只有我不知道的事情是,如果@@ TRANCOUNT反映来自交易范围的交易,尽管它值得一试。

相关问题