3

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

以下哪项最准确:

  1. 单个 BEGIN/COMMIT TRANSACTION 是否可以保证所有数据库中的所有语句都成功?
  2. 对于数据库上的每组命令,我是否需要多个 BEGIN TRANSACTIONS?
  3. 更新远程数据库时是否支持事务?我需要执行具有嵌入式事务支持的远程 SP。

请注意,我不关心任何类型的跨数据库引用完整性;如果可能,我只是尝试从单个存储过程同时更新多个数据库。

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

4

2 回答 2

4

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

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

要走的路是解耦服务器,使用Service Broker之类的东西而不是 DQ。

于 2010-06-01T23:37:36.840 回答
1

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

处理 DTC 可能会遇到很多问题,祝你好运:)

于 2010-06-01T20:46:02.673 回答