侧边栏壁纸
  • 累计撰写 793 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

目 录CONTENT

文章目录

事务

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 167 阅读 / 473 字
温馨提示:
本文最后更新于 2022-07-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

//失败时 手动回滚
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, "添加商品失败!");
}
0

评论区