我们正在执行从源数据库到目标数据库的导入过程。我们需要以自动化的方式频繁地运行这些导入。
源位于与目标不同的服务器上。两者都是 MS SQL 2008。我们使用 Linq2SQL 访问源,使用自定义数据层访问目标。我们从不修改源数据库(尽管我们目前不将其恢复为只读)。但是,现在当我们在 transactionScope 中运行导入时,整个事务被提升为 DTC,因为我们访问了不同服务器上的两个 DB。
如果我们将源数据库设为只读,它还会这样做吗?
在这种情况下如何避免 DTC 促销还有其他建议吗?
Remus 回答的后续问题(再次感谢):
跟进#1:我的导入例程的结构是它从源导入记录并在目标中创建新记录。像这样:
using(var scope = new TransactionScope())
{
// read some from source db using Linq2Sql
// transform source info
// update destination
// read some more from source db using Linq2Sql
// transform source info
// update destination
}
您是说用 RequiresNew 包围 TransactionScope 中的 Linq2Sql 位吗?或者,我想,因为我真的不关心源头的事务,我可以用带有 Suppress 的 TransactionScope 来包围该连接是否包含在任何事务中,对吧?
跟进#2:
当你说“打开第二个连接,即使是同一个数据库” - 我已经阅读了几个关于这个的变体:
- “第二个连接” == Connection 对象的第二个实例,即使它完全相同的连接字符串
- “第二个连接” == 连接到单独的资源管理器和 SQL2005 之前,这意味着与上面的 1 相同,但在 SQL2008 上,这意味着一个单独的实例(即同一实例上的两个 DB 不会被提升)