我将 System.Transactions 和 Transaction 范围与 Enterprise Library Data Access Application Block 一起用于我的事务处理。
在某些情况下,我在事务中使用 Database 类的单独实例。但是,连接是到同一个数据库。
我想知道在这种情况下,应用程序块是否会重用相同的连接而不跨越分布式事务?
我将 System.Transactions 和 Transaction 范围与 Enterprise Library Data Access Application Block 一起用于我的事务处理。
在某些情况下,我在事务中使用 Database 类的单独实例。但是,连接是到同一个数据库。
我想知道在这种情况下,应用程序块是否会重用相同的连接而不跨越分布式事务?
简而言之, MSDN有你的答案:
“另一方面,企业库通常会为每个请求打开和关闭一个连接。这种做法与 TransactionScope 类的工作方式不兼容。如果有多个连接,则 TransactionScope 类将事务视为分布式事务。分布式与本地事务相比,事务具有显着的性能和资源开销。” (MSDN)
和
“为避免这种情况,数据库类方法(如 ExecuteDataSet)会识别 TransactionScope 实例何时处于活动状态,并在此事务中登记数据库调用。如果事务当前由于使用 TransactionScope 实例而处于活动状态,则数据库类方法使用一个单一的连接。” (MSDN)
你没有提到你正在使用什么数据库。在我使用的 Oracle 10g 客户端中,如果您使用 TransactionScope,您将始终拥有分布式事务。看起来这个问题现在在以后的版本中得到解决。
您可以通过查看Transaction Statistics来检查答案。
TransactionScope
是一种非常奇怪的野兽。根据我的经验,一旦另一个连接(甚至是同一个数据库)打开,数据库事务就会被提升为分布式事务。