@Resource
private TransactionTemplate transactionTemplate;
/**
* @description
* @author chenchen
* @date 2023/5/18 17:54
* @param supportMilesightUplinkDataBo
* @return boolean
*/
@Override
@Transactional(rollbackFor = Exception.class)
public boolean uplinkData(SupportMilesightUplinkDataBo supportMilesightUplinkDataBo) {
System.out.println(supportMilesightUplinkDataBo);
//主线程更新数据,声明式事务控制父线程回滚
SupportRfidSubTask supportRfidSubTask = new SupportRfidSubTask();
supportRfidSubTask.setId(911L);
supportRfidSubTask.setNumberUnit("999");
supportRfidSubTaskService.updateById(supportRfidSubTask);
//子线程更新数据,编程式事务控制子线程回滚
FutureTask<Boolean> futureTask = new FutureTask<>(() -> transactionTemplate.execute(new TransactionCallback<Boolean>() {
/**
* @param status 事务运行状态信息 是否是新事务、是否已被标记为回滚等
* @return
*/
@Override
public Boolean doInTransaction(@NotNull TransactionStatus status) {
try {
SupportRfidSubTask supportRfidSubTask2 = new SupportRfidSubTask();
supportRfidSubTask2.setId(912L);
supportRfidSubTask2.setNumberUnit("888");
supportRfidSubTaskService.updateById(supportRfidSubTask2);
throw new RuntimeException("子线程执行失败了");
//return true;
} catch (Exception exception) {
System.out.println("执行事务异常,需要回滚");
//触发子线程事务回滚
status.setRollbackOnly();
throw new RuntimeException(exception.getMessage());
}
}
}));
new Thread(futureTask).start();
Boolean result;
try {
//获取子线程的结果,子线程抛出异常直接捕获
result = futureTask.get();
} catch (Exception e) {
//抛出异常触发父线程事务回滚
throw new RuntimeException(e.getCause().getMessage());
}
return result;
}
子线程抛出异常回滚子线程以及子线程所在父线程
于 2023-05-18 17:50:26 首次发布