尽管有try catch语句,但仍抛出Java异常

时间:2018-11-15 06:09:56

标签: java spring spring-transactions transactional

我有这种格式的代码(java + spring):

@Service
public class mainService{

@Inject 
 private ServiceA a;

@Inject 
private ServiceB b;

@Transactional
public void methodTest{

  try{
    System.out.println("Start");
    a.insertIntoDbTableOne();
    b.insertIntoDbTableTwo();
  }catch(Throwable e){
    e.printStackTrace();
    System.out.println("This is the catch statement");
  }finally{
   System.out.println("this is finally");
  }
 }
}

在我的动作课中,我通过将mainService.java注入作为服务来调用它。

被调用的ServiceAServiceB方法也都带有@Transactional注释。

奇怪的是,当我运行这段代码时(当它插入db时,我使它在ServiceA方法中引发错误),结果序列不是我期望的。

结果是:

1. "Start" is printed
2  Do stuff in insertIntoDbTableOne method (without inserting into db)
3. Do stuff in insertIntoDbTableTwo method (without inserting into db)
4. "this is finally" is printed
5. The system tries to insert the record the db which should be inserted in step 2 and hit error!

我认为这是由事务注释引起的,但是我尝试通过insertIntoDbTableOne方法删除事务注释,但这无济于事。

有什么主意如何使系统在try catch中捕获此错误?我不能只在调用此methodTest的动作类中捕获它。

1 个答案:

答案 0 :(得分:0)

我刚刚找到了解决我所遇到问题的方法。 这个问题似乎与春季交易管理有关,我正在发布我的解决方法,以防将来有人遇到类似的问题。

对于spring @transactional方法,它将保持与db相关的操作,直到该方法结束。这就是为什么我在methodTest中的try catch无法捕获这些错误的原因。当methodTest结束时,将仅执行那些db操作。

为解决此问题,我在与methodTest相同的层上创建了另一个方法,并将其命名为methodTestTwo()

df['VALUE_2'] = df['A'].map(df.set_index('B')['VALUE'])
print (df)
       A      B  VALUE  VALUE_2
0   left  right      0        1
1  right   left      1        0
2   east   west      2        3
3   west   east      3        2
4  south  north      4        5
5  north  south      5        4

因此,在我的主要动作类中,我将改为调用mainService.methodTestTwo()。在这种情况下,事务管理将在执行methodTest()时结束,并且错误将在methodTestTwo中捕获,请尝试catch!。

希望有帮助