我有这种格式的代码(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
注入作为服务来调用它。
被调用的ServiceA
和ServiceB
方法也都带有@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
的动作类中捕获它。
答案 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!。
希望有帮助