sno*_*ndy 4 database oracle transactions 2phase-commit distributed-transactions
所有事务管理器(Atomikos,Bitronix,IBM WebSphere TM等)都将一些"事务日志"保存到文件系统的"tranlogs"文件夹中.
当一些可怕的事情发生并且服务器崩溃时,有时变更会被破坏.它们需要一些手动恢复程序.
我被告知,通过简单地清除已损坏的tranlogs文件夹,我冒着参与交易的资源状态不一致的风险.
作为一个"愚蠢"的开发者,我对简单的概念感到更舒服.我想认为分布式事务管理应该与常规事务管理相似:
问题
为什么我不这样想?2PC有什么这么复杂的?
当我清除损坏的tranlogs时,确切的风险是什么?
如果我错了,我真的需要所有混乱的2PC文件系统状态.TX经理是否能够以简单而丑陋的方式实际破坏存储状态这一事实,您是否感到恶心?
当我在1994年第一次面对现实生活中的2阶段提交时(最初是在更大的Oracle7环境中),我有类似的初步反应.通常不太可能使它变得简单,这真是一种血腥的耻辱.但回顾大学的算法书籍,很明显2PC没有通用的解决方案.
例如,请参阅如何在分布式环境中达成共识
当然,有许多特定情况可以解决事务的2PC提交更容易完成或完全回滚并且影响较小.但是一般问题仍然存在,无法解决.
在这种情况下,交易经理必须在某个时间决定做什么; 交易不能永远保持开放.因此,作为最终解决方案,他们将始终需要返回到他们自己的交易日志,因为一个或多个其他方可能无法在不久的将来可靠地传达状态.一些交易管理人员可能更高级,并且知道如何更轻松地解决某些案例,但仍需要最终的后备支持.
我很抱歉.修复它通常似乎与二进制逻辑中的"Falsity暗示任何东西"相同.
开Why can't I think like this?和What's so complicated about 2PC:见上文.这个算法问题无法普遍解决.
On What are the exact risks when I clear broken tranlogs?:事务管理器有一些数据库支持它.删除translogs是一般关系数据库软件中的相同问题; 你发现正在进行的交易的信息.某些数据库平台仍然可以包含某些或大部分整数文件.有关背景和一些数据库理论,请参阅Wikipedia.
On Don't you feel sick about the fact that TX manager can actually break storage state in an easy and ugly manner?:是的,有时当我必须完成团队的大量工作时,我真的很讨厌它.但是,它让我有一份工作:-)
从您的添加中我了解到您在考虑是否在项目中包含2PC.
在我看来,您的里程可能会有所不同.我们公司有2PC的政策:尽可能避免它.但是,在某些环境中,尤其是遗留系统和复杂环境(例如银行业中发现的环境),您无法解决这些问题.客户需要它,他们可能不愿意允许您对其他基础设施组件进行重大更改.
当你必须做2PC:做得好.我喜欢软件和基础设施的简洁架构,而且非常简单,即使是5年后它也很清楚它是如何工作的.
对于所有其他情况,我们远离两阶段提交.我们有自己的框架(Invantive Producer),从客户端到应用服务器到数据库后端.在这个框架中,我们选择在正常工作在分布式环境中时牺牲ACID的元素.应用程序开发人员必须注意自己的原子性.通常这很简单,甚至不需要考虑.例如,所有软件必须安全重启.即使具有事务的原子性,这也需要一些思考才能在庞大的多用户环境中做得很好(例如锁定问题).
一般来说,这种愚蠢的方法很容易理解和维护.在我们被要求进行两阶段提交的情况下,我们已经能够替换框架上的一些插件并对客户端代码进行一些更改.
所以我的建议是:
我希望这可以帮助你.如果你能告诉我更多关于你的典型环境(#tables的大小,GB持久数据的大小,#concurrent用户的大小,典型的事务管理软件和平台),我可以做一些补充或改进.
关于是否建议DB与JMS结合:不,将DB与JMS结合起来通常没有什么用处; 它本身已经有一些数据库,因此有关事务日志的原始问题.
关于您的业务案例:我了解每个事件都会从模板发送电子邮件,并且外发邮件在数据库中注册为事件.
这是一个难以破解的难题; 我一直很享受安全审计,最简单的安全问题之一就是检查电子邮件的使用情况.
电子邮件 - 除了在明信片等大多数情况下不保密和防篡改之外 - 无法保证在没有额外措施的情况下交付和/或阅读.例如,即使在您的邮件传输代理和收件人之间直接发送电子邮件,也可能在没有通知交易监视器的情况下发生数据丢失.当涉及多个跃点时,甚至会变得更糟.例如,每个MTA都有自己的排队机制,"炸弹可以丢弃",导致数据丢失.但你也可以想到垃圾邮件措施,错误的配置,邮件循环,意外删除文件等等.即使你可以使用2PC注册发送电子邮件而不丢失任何交易信息,这绝对不知道是否电子邮件将全部到达,甚至可以跨越第一跳.
我工作的公司为项目驱动的业务销售大型软件包.该软件包具有集成的排队机制,该机制还处理电子邮件事件.现在通常与Exchange的大多数实现相结合.几个月我们遇到了一个很好的问题:交易开始,打开邮件渠道,邮件作为MTA发送到Exchange,注册邮件已处理...事务中止,因为Oracle表空间已满.在下一次运行中,邮件再次传递到Exchange,再次中止,等等.此算法现在已得到增强,但从这个简单示例中您可以看到您需要所有端点在您的2PC中进行协作,即使某些端点也是如此在收到并显示您的电子邮件的组织中很远.
如果您需要采取措施确保发送或阅读电子邮件,则需要通过其他措施对其进行补充.请从文献中选择一个应用程序控件,用户控件和过程控件.