我有一个Spring Boot(1.5.8)应用程序,我在其Repository方法中使用了@Transactional注释。 这些方法在完成时和有异常时工作正常。 但是当我在终端或System.exit()上使用Eclipse的停止按钮 Ctrl + c 来退出我的应用程序时,它会提交当前事务而不是回滚它。
@Transactional(rollbackFor=Throwable.class, propagation= Propagation.REQUIRES_NEW )
public ArrayList<Item> saveItemBatch(ArrayList<Item> items) {
ArrayList<Item> rejectedItems = new ArrayList<Item>();
for (Item item : items) {
if(saveItem(item)==null) {
rejectedItems.add(item);
}
}
return rejectedItems;
}
@Transactional(rollbackFor=Throwable.class, propagation= Propagation.REQUIRES_NEW )
public ArrayList<Item> saveItemBatchException(ArrayList<Item> items) {
ArrayList<Item> rejectedItems = new ArrayList<Item>();
for (Item item : items) {
if(saveItem(item)==null) {
rejectedItems.add(item);
}
}
if(items.size()>0) {
throw new RuntimeException();
}
return rejectedItems;
}
@Transactional(rollbackFor=Throwable.class, propagation= Propagation.REQUIRES_NEW )
public ArrayList<Item> saveItemBatchExit(ArrayList<Item> items) {
ArrayList<Item> rejectedItems = new ArrayList<Item>();
for (Item item : items) {
if(saveItem(item)==null) {
rejectedItems.add(item);
}
}
System.exit(0);
return rejectedItems;
}
private boolean saveITem(Item item) {
SimpleJdbcCall jdbcCall = ...;/*Get jdbcCall*/
HashMap<String, Object> callParams = ...;/*get parameters map*/
Map<String, Object> result = jdbcCall.execute(callParams);
String errorCode = (String) result.get("ERROR_CODE");
return (errorCode==null);
}
每个方法 saveItemBatch * 都有一个循环,在那里他们调用Oracle的存储过程。
当我调用 saveItemBatch 或 saveItemBatchException 时,它会按预期工作,首先提交它,然后在第二个提交时回滚。 但是,如果我调用 saveItemBatchExit ,或者我尝试使用 Ctrl + c 或Eclipse的停止按钮停止我的应用程序,同时调用 saveItemBatch 或 saveItemBatchException ,它提交当前事务。
我正在使用: auto-commit = false ojdbc6.jar