//失败时 手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
本质
Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交. 自己弄也行,
Connection conn = DriverManager.getConnection();
try {
conn.setAutoCommit(false); //将自动提交设置为false
执行CRUD操作
conn.commit(); //当两个操作成功后手动提交
} catch (Exception e) {
conn.rollback(); //一旦其中一个操作出错都将回滚,所有操作都不成功
e.printStackTrace();
} finally {
conn.colse();
}
事务传播
在开启事务的方法A里调用方法B
七种方式
PROPAGATION_REQUIRED 要求 有加入, 没有创建, 这是最常见的选择。
PROPAGATION_SUPPORTS 支持 有就用,没有就没有.
PROPAGATION_MANDATORY 托管 有就用,没有就抛异常。
PROPAGATION_REQUIRES_NEW 要求新的 有就挂起, 有没有都新建
PROPAGATION_NOT_SUPPORTED 不支持 有挂起,没有就没有.
PROPAGATION_NEVER 从不用 有抛异常, 没有就没有.
PROPAGATION_NESTED 嵌套 有嵌套 ,没有新建
使用
加在方法前.
@Transactional(propagation = Propagation.REQUIRED)
@Transactional(propagation = Propagation.REQUIRES_NEW)
回滚研究
默认Spring 事务只在发生未被捕获的 RuntimeExcetpion时才回滚。
自己try catch 处理异常后事务就不会回滚了. 自己再throw new RuntimeExcetpion() 或者用下面这句手动抛异常
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
LocalDateTime date = LocalDateTime.now();
item.setCreated(date);
item.setUpdated(date);
try {
if (itemMapper.insert(item) <= 0) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Result.OK(500, "添加商品基本信息失败!");
}
if (itemDescMapper.insert(new TbItemDesc(item.getId(), desc, date, date)) <= 0) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Result.OK(500, "添加商品详细信息失败!");
}
if (itemParamMapper.insert(new TbItemParam(item.getId(), itemParams, date, date)) <= 0) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Result.OK(500, "添加商品规格参数失败!");
}
return Result.OK(200, "添加商品成功");
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Result.OK(500, "添加商品失败!");
}
评论区