【问题标题】:Cross-database transactions from one SP来自一个 SP 的跨数据库事务
【发布时间】:2011-02-26 12:43:59
【问题描述】:
我需要用几条简单的 SQL 语句更新多个数据库。使用“链接服务器”在 SQL 中配置数据库,并且 SQL 版本是混合的(SQL 2008、SQL 2005 和 SQL 2000)。我打算在其中一个数据库中编写一个存储过程,但我想使用事务来确保每个数据库都得到一致的更新。
以下哪项最准确:
- 单个 BEGIN/COMMIT TRANSACTION 能否保证所有数据库中的所有语句都成功?
- 对于数据库上的每个单独的命令集,我是否需要多个 BEGIN TRANSACTIONS?
- 更新远程数据库时是否支持事务?我需要执行一个带有嵌入式事务支持的远程 SP。
请注意,我不关心任何类型的跨数据库引用完整性;如果可能的话,我只是尝试从一个存储过程同时更新多个数据库。
也欢迎任何其他建议。谢谢!
【问题讨论】:
标签:
sql-server
distributed-transactions
【解决方案1】:
这是可能的。您可以在控制过程中使用显式BEGIN DISTRIBUTED TRANSACTION,或者简单地启动一个正常事务并依赖DTC 在您通过链接服务器时将您的事务提升为分布式事务,这会自动发生。请参阅 MSDN 中的 Transact-SQL Distributed Transactions。
但是我必须警告你这是一个滑坡。一旦您将 DQ(分布式查询)带入画面,故障数量和停机时间就会急剧增加。如果您有 99.5% 的服务器正常运行时间(即每年 43 小时的停机时间)并且您的查询涉及 5 台服务器,那么您的可用性将变为 97.5%(每年的停机时间为 216 小时)。使用 10 台服务器,它的正常运行时间为 95%(一年的停机时间为 428 小时)。诸如管理操作系统补丁部署、引擎 SP 升级或应用程序维护(想想索引重建等)之类的事情成为协调和协调的噩梦。
要走的路是解耦服务器,使用 Service Broker 之类的东西而不是 DQ。
【解决方案2】:
您应该能够使用分布式事务完成 #1。您需要激活 DTC,并且需要在存储过程中使用 BEGIN DISTRIBUTED TRANSACTION 以及 ROLLBACK TRANSACTION 和 COMMIT TRANSACTION。
处理 DTC 可能会遇到很多问题,祝你好运 :)