当我停止我的应用程序时,Spring正在提交事务

时间:2018-03-19 18:51:50

标签: java spring oracle spring-boot spring-transactions

我有一个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

0 个答案:

没有答案