Tag: distributed transactions

建议的做法是在使用transactioncope时停止升级到分布式的事务

使用TransactionScope对象来设置不需要跨函数调用传递的隐式事务非常棒! 但是,如果连接打开而另一个连接已打开,则事务协调器会静默升级要分发的事务(需要MSDTC服务运行并占用更多资源和时间)。 所以,这很好: using (var ts = new TransactionScope()) { using (var c = DatabaseManager.GetOpenConnection()) { // Do Work } using (var c = DatabaseManager.GetOpenConnection()) { // Do more work in same transaction using different connection } ts.Complete(); } 但这会使交易升级: using (var ts = new TransactionScope()) { using (var c = DatabaseManager.GetOpenConnection()) { // Do […]

TransactionScope:避免分布式事务

我有一个父对象(DAL的一部分),其中包含子对象的集合( List )。 当我将对象保存回DB时,我输入/更新父对象,然后循环遍历每个子对象。 为了可维护性,我将子项的所有代码放入一个单独的私有方法中。 我打算使用标准的ADO事务,但在我的旅行中,我偶然发现了TransactionScope对象,我相信这将使我能够在一个事务中将父方法中的所有数据库交互(以及子方法中的所有交互)包装起来。 到现在为止还挺好..? 接下来的问题是如何在TransactionScope中创建和使用连接。 我听说使用多个连接,即使它们属于同一个DB,也可能迫使TransactionScope认为它是一个分布式事务(涉及一些昂贵的DTC工作)。 是这样吗? 或者是,正如我似乎在其他地方读到的那样,使用相同的连接字符串(它将自己用于连接池)的情况会好吗? 更实际的是,我…… 在父和子中创建单独的连接(尽管具有相同的连接字符串) 在父项中创建一个连接作为参数传递它(对我来说似乎很笨拙) 做点什么……? 更新: 虽然看起来我可以使用我常用的.NET3.5 +和SQL Server 2008+,但这个项目的另一部分将使用Oracle(10g),所以我不妨练习一种可以跨项目使用的技术。 所以我只是简单地将连接传递给子方法。 选项1代码示例: using (TransactionScope ts = new TransactionScope()) { using (SqlConnection conn = new SqlConnection(connString)) { using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = conn; cmd.Connection.Open(); cmd.CommandType = CommandType.StoredProcedure; try { //create & add […]