依赖于阳光场景中的db事务回滚

时间:2009-08-06 07:07:42

标签: database transactions

在我目前正在维护的金融系统中,我们依靠数据库的回滚机制来模拟运行一些大批量作业的结果 - 回滚事务或在最后提交它,具体取决于我们是否在做试运行。

我真的无法确定我的意见。在某种程度上,我认为这很好,因为那时模拟和实际运行之间没有区别 - 另一方面,它只是感觉有点像icky,例如取决于抛出异常以执行业务逻辑的代码。

您对依靠数据库事务执行业务逻辑有何看法?

实施例

考虑在数据库中具有1000个抵押契约的管理系统。现在,用户希望运行批处理作业,在每个契约上创建下一个术语发票,使用一些高级搜索条件来决定要开具哪些契约。

在实际执行此操作之前,她执行测试运行(通过执行实际运行但以事务回滚结束),创建一个报告,其中将开具契约。如果它看起来令人满意,她可以选择进行实际运行,这将以事务提交结束。

每张发票都会印有批号,如果需要,我们可以在以后恢复更改,因此批量运行并不“危险”。用户只是觉得能够首先模拟结果是更好的用户体验。

澄清

这不是关于测试。我们确实有测试和登台环境。这是关于使用我们的系统的普通用户想要模拟大型操作的结果,即使不是,也可能看起来“无法控制”或“不可逆转”。

结论

似乎没有人对我们的解决方案有任何真正好的论据。与往常一样,上下文意味着一切,因此在超出性能要求的复杂功能需求的上下文中,使用db rollback实现批量作业模拟似乎是一个可行的解决方案。

由于这个问题没有真正的答案,我没有选择答案 - 相反,我赞成那些真正提出论点的人。

8 个答案:

答案 0 :(得分:2)

  

在她实际执行此操作之前,她会进行一次测试运行(通过执行实际运行但以事务回滚结束),创建一个报告,其中将开具契约。如果它看起来令人满意,她可以选择进行实际运行,这将以事务提交结束。

这是错误的,容易出现故障,并且必须在数据库日志上下地狱。除非你将模拟和实际运行包装在单个事务中(根据检查1000个行为所需的时间线来判断,会导致大量被阻止的用户),否则测试运行和实际运行之间无法保证一致性。如果有人更改了数据,添加了行等,那么最终可能会得到不同的结果 - 从而无法完成测试运行的全部目的。

执行此操作的更好模式是测试运行以标记记录,以及实际运行以获取标记记录并处理它们。或者,如果您有一个胖客户端应用程序,您可以将记录下拉到客户端,显示报告,并且 - 如果批准 - 将其推回。

答案 1 :(得分:2)

我认为这是一种可接受的方法,只要它不会干扰常规处理。

另一种方法是建立一个显示审查结果的查询,但我们都有过采取这种方法的经验,并没有完全正确;或者发现上下文在查询和执行之间发生了变化。

在1000行的范围内,系统负载不太可能是繁重的。

答案 2 :(得分:1)

我们可以看到用户需要做什么,这是非常合理的事情。我的意思是我们第一次获得正确的regexp的频率是多少?精炼查询直到它完全符合您的要求并不罕见。

不捕获错误的业务后果可能非常高,因此进行试运行是有道理的。

鉴于一张白纸,我确信我们可以设计一个在系统的正式行为中表达的干净实现,而不是这个有点落后的appraoch。

我现在要付出多少努力来解决这个问题?取决于当前的方法是否真的受到伤害。我们可以想象,在使用较多的系统中,它可能会导致数据库中的争用。

答案 3 :(得分:1)

我在该银行工作的PRO FORMA环境所写的内容也完全是用户的事情。

答案 4 :(得分:0)

我不确定你在这里问的确切。从字面上看你

  

您对依赖的看法是什么?   数据库事务要进行   你的业务逻辑?

嗯,这就是我们进行交易的原因。我们确实依赖它们。我们遇到错误并中止事务并依赖在该事务范围内完成的工作进行回滚。因此,利用我们系统的交易行为是一件非常好的事情,如果我们不这样做,我们就需要自己动手做同样的事情。

但我认为你的问题是关于在实时系统中进行测试,并且依赖于不进行修改以便不造成任何损害。在理想的世界中,我们有一个实时系统和一个测试系统,我们不会搞乱实时系统。这种理想很少见。更常见的是“修补现场系统。测试?你的意思是测试什么?”事实上,与一些人相比,你在游戏中处于领先地位。

另一种方法是在实时系统中使用虚拟数据,以便某些操作可以实际运行。再次,容易出错。

令人意外的高比例的系统中断是由于手指麻烦,这是人类犯规。

答案 5 :(得分:0)

它的工作原理 - 如你所说。我担心系统的并发性,因为事务将持有锁,可能有很多锁。这意味着您的测试将阻止系统上的任何实时操作(并且任何实时操作操作都将阻止您的测试)。通常最好使用测试系统进行测试。我不喜欢它,但是如果运行测试而忘记回滚的风险不是问题,也不是干扰,那么它是获得“假设”类型计算的有效方法。但还是不太干净。

答案 6 :(得分:0)

当我在一家属于“金融系统”的公司工作时,有一个项目团队决定使用生产环境来测试他们的转换过程(并且最后只是回滚而不是提交)。

他们几乎被枪杀了。经过事后的考虑,很可惜他们不是。

您声称拥有的测试环境适合IT人员使用。获得类似的“PRO-FORMA”环境,您可以保证您的用户只能使用它们。

当我在该银行工作时,创建这样一个PRO-FORMA环境是每年关闭的标准程序。

答案 7 :(得分:0)

“但这不是关于测试,而是关于想要模拟大型工作结果的用户。”

释义:“这不是关于测试,而是关于模拟”。

有时我希望Fabian Pascal还在营业。

(哦,如果有人不明白:两者都是“不会使结果永久化”。)