在当今时代,事务性编程是现代开发中的一项重要内容。并发性和容错性对于应用程序的寿命至关重要,而且事务逻辑已经变得很容易实现。然而,随着应用程序的增长,事务性代码似乎会对应用程序的可伸缩性带来越来越大的负担,当您连接到分布式事务和镜像数据集时,问题开始变得非常复杂。我很好奇,在数据大小或应用程序复杂性方面,事务往往开始成为问题的根源(导致任务关键代码中的超时、死锁、性能问题等),这些问题比设计一个本身更具容错性的数据模型或使用其他方法确保数据完整性更麻烦。此外,什么样的设计模式可以最大限度地减少这些影响,或者使标准事务逻辑过时或不存在问题?
--
编辑:到目前为止,我们已经得到了一些质量合理的答案,但我想我会自己发布一个答案,提出一些我听说过的东西,试图激发更多的创造力;我得到的大多数回答都是对问题的悲观看法。
另一个重要的注意是,并非所有的死锁都是代码错误的过程造成的;有时任务关键操作依赖不同顺序的相似资源,或者在不同的查询中相互执行复杂的连接;这个问题有时看起来是不可避免的,但我参与了工作流程的重新工作,以方便执行命令,而执行命令不太可能导致执行命令。
发布于 2008-09-17 21:30:26
我认为任何设计模式本身都不能解决这个问题。良好的数据库设计,良好的存储过程编程,特别是学习如何保持事务短,将缓解大多数问题。但是,没有100%保证没有问题的方法。
基本上,在我职业生涯中看到的每一种情况下,死锁和减速都是通过修复存储过程来解决的:
发布于 2008-09-17 21:34:08
从长远来看,共享资源的使用是错误的。因为通过重用现有的环境,您正在创造越来越多的可能性。只需回顾一下繁忙的海狸:) Erlang的方式是产生容错和易于验证的系统的正确方法。
但是,对于许多广泛使用的应用程序来说,事务性内存是必不可少的。例如,如果你咨询一家银行的数百万客户,你就不能为了效率而复制数据。
我认为monads是一个很酷的概念来处理改变状态这一困难的概念。
发布于 2008-09-17 21:36:14
如果您在这里谈论的是“云计算”,答案将是将每个事务定位到云中发生的位置。
不需要整个云保持一致,因为这会降低性能(正如您所注意到的)。简单地说,跟踪更改的内容和位置,并在更改在系统中传播时处理多个小事务。
在云的另一端,用户A更新记录R和用户B的情况(尚未)与用户A在当前严格事务环境中尚未进行更改时的情况相同。这可能会导致更新密集型系统中的差异,因此系统的体系结构应该尽可能少地使用更新--将事物移动到数据的聚合,并在精确的图形关键时提取聚合(即从写入时间到临界读取时间的一致性要求)。
只是我的战俘。在这种情况下,很难设想一个与应用无关的系统。
https://stackoverflow.com/questions/87796
复制相似问题