【发布时间】:2019-07-01 05:30:30
【问题描述】:
我的问题如下。 伪代码如下:
public Object rollBackTestMainMethod(List<Object> list) {
List<Object> responseList = new ArrayList<>();
for(Object item:list){
try{
Boolean isOperationSuccess = rollBackTestSubMethod(item);
if (isOperationSuccess==null || !isOperationSuccess){
item.addError("Operation failed");
item.addSuccess(false);
} else {
item.addError(null);
item.addSuccess(true);
}
} catch(Exception exception) {
item.addError(exception.getMessage());
item.addSuccess(false);
}
responseList.add(item);
}
return responseList;
}
@Transactional(rollbackFor = {Exception.class, SQLException.class})
private Boolean rollBackTestSubMethod(Object listItem){
Long value1=save(listItem.getValue1());
if(value1==null){
throw new Exception("Error during save 1");
}
Long value2=save(listItem.getValue2());
if(value2==null){
throw new Exception("Error during save 2");
}
Long value3=save(listItem.getValue3());
if(value3==null){
throw new Exception("Error during save 3");
}
return Boolean.TRUE;
}
我在这里做什么:
- 在
rollBackTestMainMethod()中迭代一个列表。在rollBackTestSubMethod()中发送一个列表项并执行 3 次保存操作。 - 如果全部保存完成则返回真响应,否则抛出异常。
- 在
rollBackTestMainMethod()中,得到响应或异常后,在每一项上添加错误或成功值。 - 正在将此项添加到名为
responseList的新列表中。在所有操作之后,它会将其作为响应发送回来。
我的问题:
- 从
rollBackTestSubMethod()抛出后,它不会被回滚,因为它是从 try catch 块调用的。 - 如果我想通过
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();强制回滚,那么对于任何抛出/异常,它将回滚所有项目。 - 这里我只想回滚投掷物品而不是所有物品。
- 此方法在 Spring bean 中
- 我正在通过 spring data jpa 将数据保存到我的关系数据库中
我的进口:
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
【问题讨论】:
-
rollbackFor = {Exception.class, SQLException.class}是无关的。方法没有throws SQLException或任何其他检查异常,@Transactional默认回滚RuntimeException。 -
感谢先生的评论。我只是添加了 sudo 代码。请忽略 SqlException :)
-
“须藤代码”?你的意思是pseudocode?
-
哦,对不起,它的伪代码
-
Sudo 代码其实比伪代码好。支持自己@Andreas
标签: java spring hibernate spring-boot spring-data