来自一个SP的跨数据库事务

时间:2010-06-01 20:03:25

标签: sql-server distributed-transactions

我需要使用一些简单的SQL语句更新多个数据库。使用“链接服务器”在SQL中配置数据库,并混合使用SQL版本(SQL 2008,SQL 2005和SQL 2000)。我打算在其中一个数据库中编写存储过程,但我想使用事务来确保每个数据库一致地更新。

以下哪项最准确:

  1. 单个BEGIN / COMMIT TRANSACTION是否可以保证所有数据库中的所有语句都成功?
  2. 我是否需要为数据库中的每组命令设置多个BEGIN TRANSACTIONS?
  3. 更新远程数据库时是否支持事务?我需要执行一个带有嵌入式事务支持的远程SP。
  4. 请注意,我不关心任何类型的跨数据库参照完整性;我只是尝试从单个存储过程同时更新多个数据库。

    欢迎任何其他建议。谢谢!

2 个答案:

答案 0 :(得分:4)

有可能。您可以在控制过程中使用显式BEGIN DISTRIBUTED TRANSACTION,或者只是启动正常事务并依靠DTC在您通过链接服务器时将事务提升为分布式事务,这会自动发生。请参阅MSDN中的Transact-SQL Distributed Transactions

但是我必须警告你,这是一个滑坡。一旦将DQ(分布式查询)带入图片中,故障数量和停机时间就会急剧增加。如果您有99.5%的正常运行时间服务器(即每年43小时的停机时间),并且您的查询涉及5台服务器,则您的可用性变为97.5%(每年216小时的停机时间)。使用10台服务器,它可以达到95%的正常运行时间(停机时间为428小时)。管理操作系统补丁部署,引擎SP升级或应用程序维护(想想索引重建等)等事情成为协调和协调的噩梦。

要做的就是解耦服务器,使用Service Broker而不是DQ。

答案 1 :(得分:1)

您应该能够使用分布式事务完成#1。您需要激活DTC,并且您需要在存储过程中使用BEGIN DISTRIBUTED TRANSACTION以及ROLLBACK TRANSACTION和COMMIT TRANSACTION。

处理DTC可以解决很多问题,祝你好运:)