什么时候每个多个数据库连接有一个事务是有意义的?

时间:2010-01-29 12:37:23

标签: sql-server database ado.net distributed-transactions

任何人都可以帮我看看在什么样的情况下拥有一个共享数据库事务和多个连接是有意义的? 感谢。

3 个答案:

答案 0 :(得分:3)

如果您的意思是在一个事务中更新所有数据库,那么您将为Atomicity执行此操作 - http://en.wikipedia.org/wiki/Atomicity_(database_systems)

假设银行转帐,每个帐户提供商使用不同的数据库 - 资金必须留下一个帐户并更新到另一个帐户。如果它在某种程度上失败 - 例如第二次数据库更新失败,然后钱已经离开了一个帐户但没有到达另一个帐户,这是不可接受的。

该事务意味着其中一个更新失败意味着它们全部被取消(回滚),以使数据保持在事务开始之前的状态。

答案 1 :(得分:2)

就我个人而言,我认为它在RDBMS中并不合理 - 但我可以看到它降低了非常高负载数据库的设计复杂性。

例如,在电子商务案例中,您可能将它们分区,以便产品库存在一个数据库上,而订单在另一个数据库上。在这种情况下,您在处理订单时不会减少库存数量并增加一个发票计数 - 在这种情况下,全局交易是有意义的。

但99%有更好的替代品可以在设计中解决。

- 编辑:全球交易的陷阱 -

这两点是我建议不使用全局交易的原因

第1点:

全局事务涉及多个数据库服务器(或者至少它们应该) - 全局事务需要DTC(分布式事务协调器) - 使用这样的代理会降低ORDERS因素的查询速度不是在单个机器的范围内完成,而是通过涉及多个机器,这意味着网络。

第2点:

如果您的查询设计不正确(大多数人不理解细微之处),您最终可能会锁定各个数据库中的大部分表,有时人们甚至最终会使用单个查询锁定整个表。如果没有为分布式查询设计好的东西,那么你的应用程序将会停滞不前,有人会被解雇:D。您需要确保您的查询最终只锁定它们必须的内容,并且您必须尝试确保数据的这些锁定部分仅由一个查询同时使用。

为什么在分布式查询中锁定表会更糟?因为点1,你可以按照更长因素的顺序锁定最后的订单。

- 编辑:您可能想要调查的潜在区域 -

群集技术和HPC通常使用Distributed Lock Managers。通过研究这些技术的数据管理变体,您将学到很多东西,因为它们将向您展示这些实现认为有必要获得全局锁定(这是全局事务的作用)。

答案 2 :(得分:-1)

当您需要影响多个数据库的事务操作时。