Spring事务传播详解

11 篇文章 0 订阅

说明

本文只介绍Spring的@Transactional注解的propagation属性
Controller层代码

@RequestMapping("/manage")
@Controller
public class ManageController {

	private static final Logger logger = LoggerFactory.getLogger(ManageController.class);
	
	@Resource
	private ManageService manageService;

	@RequestMapping("/insert")
	@ResponseBody
	public String insert() {
		try {
			DeviceBO bo = new DeviceBO();
			bo.setTerminalNum("11011111");
			bo.setDeviceTypeNo("3");
			bo.setOrgCode("1800");
			bo.setDeviceName("爱乐宝");
			manageService.insert(bo);
			return "success";
		} catch (Exception e) {
			logger.warn("failure", e);
			return "failure";
		}
	}

Propagation.REQUIRED(必要,最常用,是默认的事务类型)

官方说明
该事务类型是默认的事务类型。支持当前事务,如果不存在则创建一个新事务。类似于同名的EJB事务属性。

情况一

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
		throw new ServiceException("最后抛出异常");
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: 最后抛出异常

数据库里的记录都回滚了,接口返回failure。

情况二

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
			int i = 1 / 0;
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: java.lang.ArithmeticException: / by zero

数据库里的记录都回滚了,接口返回failure。

情况三

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
			int i = 1 / 0;
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: java.lang.ArithmeticException: / by zero

数据库里的记录都回滚了,接口返回failure。

情况四

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
		throw new ServiceException("最后抛出异常");
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: 最后抛出异常

数据库里的记录都回滚了,接口返回failure。

情况五

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
		throw new ServiceException("事务最后抛出异常");
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.REQUIRED, noRollbackFor = Throwable.class)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: 最后抛出异常

数据库里的记录都回滚了,接口返回failure。


Propagation.NESTED(嵌套,不常用,与Propagation.REQUIRED功能类似)

官方说明
如果当前事务存在,则在嵌套事务中执行,表现像PROPAGATION_REQUIRED。 EJB中没有类似功能。注意:嵌套事务的实际创建仅对特定的事务管理器有效。 开箱即用,仅在使用JDBC 3.0驱动程序时才适用于JDBC DataSourceTransactionManager。一些JTA提供程序可能也支持嵌套事务。

情况一

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
		throw new ServiceException("事务最后抛出异常");
	}
}


@Service
public class LogServiceImpl implements LogService {
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.NESTED)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException(e);
		}
	}
}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: 事务最后抛出异常

数据库里的记录都回滚了,可见真像PROPAGATION_REQUIRED一样。

情况二

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.NESTED)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
			int i = 1 / 0;
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: java.lang.ArithmeticException: / by zero

数据库里的记录都回滚了,接口返回failure。可见真像PROPAGATION_REQUIRED一样。

情况三

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
		throw new ServiceException("事务最后抛出异常");
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.NESTED, noRollbackFor = Throwable.class)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: 最后抛出异常

数据库里的记录都回滚了,接口返回failure。即使内部事务有noRollbackFor = Throwable.class,也回滚了。


Propagation.NOT_SUPPORTED(非事务,自动提交,永不回滚,与Propagation.REQUIRES_NEW一样不受外部事务影响)

官方说明
以非事务方式执行,如果存在当前事务,则挂起当前事务。类似于具有相同名称的EJB事务属性。注意:实际事务挂起不能在所有事务管理器上即开即用。 这尤其适用于{@link org.springframework.transaction.jta.JtaTransactionManager},它要求{@code javax.transaction.TransactionManager}对其可用(在标准Java EE中特定于服务器)。

情况一

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
		throw new ServiceException("事务最后抛出异常");
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.NOT_SUPPORTED)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: 最后抛出异常

接口返回failure。ManageServiceImpl记录回滚了,LogServiceImpl记录没有回滚。

情况二

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.NOT_SUPPORTED)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
			int i = 1 / 0;
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: java.lang.ArithmeticException: / by zero

接口返回failure。ManageServiceImpl记录回滚了,LogServiceImpl记录没有回滚。


Propagation.REQUIRES_NEW(创建新事务,在新事务内执行,与Propagation.NOT_SUPPORTED一样不受外部事务影响)

官方说明
创建一个新事务,如果存在则暂停当前事务。类似于同名的EJB事务属性。注意:实际的事务挂起将无法在所有事务管理器上立即使用。 这尤其适用于{@link org.springframework.transaction.jta.JtaTransactionManager},它要求{@code javax.transaction.TransactionManager}对其可用(在标准Java EE中服务器特定)。

情况一

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
		throw new ServiceException("事务最后抛出异常");
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.REQUIRES_NEW)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: 最后抛出异常

接口返回failure。ManageServiceImpl记录回滚了,LogServiceImpl记录没有回滚。

情况二

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.REQUIRES_NEW)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
			int i = 1 / 0;
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: java.lang.ArithmeticException: / by zero

数据库里的记录都回滚了,接口返回failure。


Propagation.MANDATORY(强制性,声明必须由在事务内的方法调用,与Propagation.NEVER作用相反)

官方说明
支持当前事务,如果不存在则抛出异常。类似于同名的EJB事务属性。

情况一

直接由ManageController调用

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	//声明调用它的方法必须开启事务或此方法必须在事务内执行,否则报错
	@Transactional(propagation = Propagation.MANDATORY)
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException(e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
	}
}

以上代码执行报如下错误

org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'

ManageServiceImpl的方法没执行,接口返回failure。

情况二

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	//未开启事务
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException(e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
	}
}

@Service
public class LogServiceImpl implements LogService {
	
	@Resource
	private LogMapper logMapper;

	@Override
	//声明调用它的方法必须开启事务或此方法必须在事务内执行,否则报错
	@Transactional(propagation = Propagation.MANDATORY)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'

ManageServiceImpl记录正常插入数据库,LogServiceImpl的方法没执行,接口返回failure。


Propagation.NEVER(非事务,声明必须由不在事务内的方法调用,与Propagation.MANDATORY作用相反)

官方说明
以非事务方式执行,如果存在事务,则抛出异常。类似于具有相同名称的EJB事务属性。

情况一

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.NEVER)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

org.springframework.transaction.IllegalTransactionStateException: Existing transaction found for transaction marked with propagation 'never'

接口返回failure。

情况二

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.NEVER)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

接口返回success。


Propagation.SUPPORTS(支持当前事务,与不加@Transactional作用类似)

官方说明
支持当前事务,如果不存在则非事务执行。类似于同名的EJB事务属性。注意:对于具有事务同步的事务管理器,PROPAGATION_SUPPORTS与根本没有事务略有不同,因为它定义了将应用同步的事务范围,因此,将共享相同的资源(JDBC连接,Hibernate会话等) 在整个指定范围内。 请注意,这取决于事务管理器的实际同步配置。

情况一

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
		throw new ServiceException("事务最后抛出异常");
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.SUPPORTS)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: 最后抛出异常

数据库里的记录都没回滚,接口返回failure。

情况二

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	@Transactional
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
		throw new ServiceException("事务最后抛出异常");
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.SUPPORTS)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: 最后抛出异常

数据库里的记录都回滚了,接口返回failure。

情况三

@Service("manageService")
public class ManageServiceImpl implements ManageService {
	
	@Resource
	private ManageMapper manageMapper;
	
	@Resource
	private LogService logService;

	@Override
	public void insert(DeviceBO bo) {
		try {
			manageMapper.insert(bo);
		} catch (Exception e) {
			throw new ServiceException("manageMapper异常", e);
		}
		LogBO logBO = new LogBO();
		logBO.setOperatetime("2020-05-05 11:11:11");
		logBO.setOperatetype("测试");
		logBO.setOperateuser("122");
		logBO.setUserorg("1000");
		logBO.setStatus("成功");
		logService.insert(logBO);
	}
}


@Service
public class LogServiceImpl implements LogService {
	private static final Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
	
	@Resource
	private LogMapper logMapper;

	@Override
	@Transactional(propagation = Propagation.SUPPORTS)
	public void insert(LogBO bo) {
		try {
			logMapper.insert(bo);
			int i = 1 / 0;
		} catch (Exception e) {
			logger.error(e.getMessage());
			throw new ServiceException(e);
		}
	}

}

以上代码执行报如下错误

com.xxx.common.dto.ServiceException: java.lang.ArithmeticException: / by zero

数据库里的记录都回滚了,接口返回failure。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值