【问题标题】:Transaction in Spring + hibernateSpring + hibernate 中的事务
【发布时间】:2012-10-28 05:44:18
【问题描述】:

我们通过声明式方法使用事务管理,我们指定所有以 update* 开头的方法必须遵循事务。

假设我们有一个事务方法 updatePayroll() 在这个方法中我们调用了另外四个方法,但我们的要求是只有在前两个方法失败的情况下才回滚,否则不需要回滚。我不知道如何实现这一点,因为我的 updatePayroll() 是事务处理方法,所以如何告诉 spring 我们只需要两个方法的 updatePayroll()应该进行交易。

代码:

public void updatePayroll()
{
// below two methods of updateParyroll is required transaction where updatePayroll is transacted method through declarative approach.
updateLWPEmployees();

processSalary();

// below methods does not require transaction.
printSalarySlip();

sendEmail();
}

提前致谢。

【问题讨论】:

  • 从这个方法中取出 printSalarySlip 和 sendEmail。
  • 这是显式事务管理的一个明显案例,即使您可以尝试不同的 hack,这也会使您的代码非常难以理解,比如对于 6 个月后阅读它的人来说。跨度>

标签: java spring hibernate spring-transactions


【解决方案1】:

如果你想避免更改事务管理配置,那么

  1. 你可以创建一个扩展RuntimeException的虚拟类,我们称之为NoRollBackException,现在你需要配置事务管理器在NoRollBackException的情况下不回滚,稍后你把两个方法printSalarySlip()和在 try catch 块中的 sendEmail() 并抛出 NoRollBackException

  1. (一种更简单的方法)您可以在调用 updatePayroll 成功后在单独的函数中调用这两个方法 (printSalarySlip() and sendEmail())。

  1. 您可以捕获这两种方法引发的异常,并且不允许传播异常。

以上所有方法都完全符合您的要求。

【讨论】:

    【解决方案2】:

    为什么不写一个包含前两个方法的事务方法呢?然后让没有事务的方法updatePayroll()包含这个方法?

    【讨论】:

      【解决方案3】:

      在说任何技术性的东西之前,我先概述一下交易不是纯粹的技术概念,我希望这种需求不是因为你只想避免你面临的一些技术难题。 我们需要在触发异常后尽可能保持事务回滚行为的语义不变:即当遇到技术问题(RuntimeException)时,您最好让事务回滚(这是默认行为),因为您没想到在这种情况下,如果您发现它在技术上不一致,那么这个处理可能在逻辑上不是事务的一部分。 否则,如果抛出的是您的异常(业务异常,在设计期间计划),那么您可以完全控制是否回滚,如第一个答案中所述。

      @woodpecker:从技术上讲,您提出的解决方案在隔离方面并不相同,尤其是当我们试图避免肮脏和可重复的阅读时

      【讨论】:

        猜你喜欢
        • 2015-03-26
        • 2011-11-01
        • 1970-01-01
        • 2011-06-13
        • 2012-10-16
        • 1970-01-01
        • 2021-11-17
        • 2018-02-15
        • 1970-01-01
        相关资源
        最近更新 更多