0

我们通过声明式方法使用事务管理,我们指定所有以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();
}

提前致谢。

4

3 回答 3

0

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

于 2012-10-29T09:08:03.030 回答
0

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

  1. 您可以创建一个扩展的虚拟类RuntimeException,让我们调用它NoRollBackException,现在您需要将事务管理器配置为NoRollBackExceptionNoRollBackException.

或者

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

或者

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

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

于 2012-10-28T05:58:19.983 回答
0

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

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

于 2012-10-29T10:40:14.640 回答