目录
- 说明
- Propagation.REQUIRED(必要,最常用,是默认的事务类型)
- Propagation.NESTED(嵌套,不常用,与Propagation.REQUIRED功能类似)
- Propagation.NOT_SUPPORTED(非事务,自动提交,永不回滚,与Propagation.REQUIRES_NEW一样不受外部事务影响)
- Propagation.REQUIRES_NEW(创建新事务,在新事务内执行,与Propagation.NOT_SUPPORTED一样不受外部事务影响)
- Propagation.MANDATORY(强制性,声明必须由在事务内的方法调用,与Propagation.NEVER作用相反)
- Propagation.NEVER(非事务,声明必须由不在事务内的方法调用,与Propagation.MANDATORY作用相反)
- Propagation.SUPPORTS(支持当前事务,与不加@Transactional作用类似)
说明
本文只介绍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。