交易什么时候成为负担而不是利益?

时间:2008-09-17 21:21:56

标签: sql performance design-patterns transactions

交易节目在这个时代是现代发展的主要内容。并发性和容错性对于应用程序的使用寿命至关重要,因此,事务逻辑变得易于实现。随着应用程序的增长,似乎事务代码在应用程序的可伸缩性方面变得越来越繁重,当您跨接到分布式事务和镜像数据集时,问题开始变得非常复杂。我很好奇,在数据大小或应用程序复杂性方面,交易经常开始成为问题的根源(导致超时,死锁,关键任务代码中的性能问题等)更难以修复,排除故障或者解决方法,而不是设计一个本身更具容错性的数据模型,或使用其他方法来确保数据完整性。此外,哪些设计模式可以最大限度地减少这些影响或使标准事务逻辑过时或无问题?

-

编辑:到目前为止,我们已经得到了一些合理质量的答案,但我想我会自己发布一个答案来提出我听过的一些事情,试图激发一些额外的创造力;我得到的大部分回答都是对问题的悲观看法。

另一个重要的注意事项是,并非所有的死锁都是程序编码不良的结果;有时,关键任务操作依赖于不同订单中的类似资源,或者不同查询中的复杂连接相互衔接;这个问题有时候似乎是不可避免的,但我一直在重新设计工作流程,以促进不太可能导致执行的执行顺序。

5 个答案:

答案 0 :(得分:2)

我认为没有设计模式本身可以解决这个问题。良好的数据库设计,良好的商店程序编程以及特别是学习如何保持交易简短将缓解大多数问题。 虽然没有100%保证没有问题的方法。

基本上我在职业生涯中看到的每一个案例中,通过修复存储过程解决了死锁和减速问题:

  • 确保按顺序访问所有表以防止死锁
  • 修复索引和统计数据可以使一切更快(从而减少死锁的可能性)
  • 有时没有真正需要交易,它只是“看起来”像它
  • 有时可以通过在单个语句中创建多个语句存储过程来消除事务。

答案 1 :(得分:2)

从长远来看,共享资源的使用是错误的。因为通过重用现有环境,您正在创造越来越多的可能性。只需查看忙碌的海狸:) Erlang的方式是生成容错且易于验证的系统的正确方法。

但事务性内存对于广泛使用的许多应用程序至关重要。例如,如果您咨询拥有数百万客户的银行,您不能仅为了提高效率而复制数据。

我认为monads是一个很酷的概念来处理改变状态的困难概念。

答案 2 :(得分:0)

如果您在这里谈论'云计算',答案是将每笔交易本地化到云中发生的地方。

整个云不需要保持一致,因为这会破坏性能(如您所述)。简单地说,随着更改在系统中传播,跟踪更改的内容和位置以及处理多个小事务。

用户A更新记录R的情况和云端另一端的用户B看不到它(尚未)与用户A在当前严格事务环境中尚未进行更改的情况相同。这可能会导致更新系统出现差异,因此应该对系统进行架构设计,以便尽可能少地处理更新 - 一旦确切的数字变得至关重要(即移动一致性要求),就会将数据移动到数据聚合并提取聚合数据从写入时间到关键读取时间。)

好吧,只是我的POV。在这种情况下,很难想象一个与应用程序无关的系统。

答案 3 :(得分:0)

尝试使用尽可能少的指令在数据库级别进行更改。

一般规则是尽可能长时间锁定资源。在Oracle上使用T-SQL,PLSQL,Java或任何类似的方式,您可以减少每个事务锁定共享资源的时间。事实上,数据库中的事务是使用行级锁,多版本和其他类型的智能技术进行优化的。如果您可以在数据库中进行事务,则可以节省网络延迟。除了ODBC / JDBC / OLEBD等其他层。

有时程序员试图获取数据库的好东西(它是事务性的,并行的,分布式的),但保留数据的快照。然后他们需要手动添加一些数据库功能。

答案 4 :(得分:0)

我听说过的一种方法是制作一个版本化的仅插入模型,其中不会发生任何更新。在选择期间,版本用于仅选择最新的行。我知道使用这种方法的一个缺点是数据库可以非常快地变得相当大。

我也知道一些解决方案,例如FogBugz,不使用强制外键,我认为这也有助于缓解这些问题,因为SQL查询计划可以在选择或更新期间锁定链接表,即使没有数据也是如此正在改变它们,如果它是一个高度争用的表被锁定,它可以增加DeadLock或Timeout的机会。

我对这些方法了解不多,因为我从未使用它们,所以我认为每个我都不知道有利有弊,以及其他一些我从未听过的技巧约。

我也一直在研究Carlo Pescio的recent post中的一些材料,遗憾的是我没有足够的时间来做正义,但材料看起来非常有趣。