需求

在service层的某个方法中,在执行完一个对数据库的写方法后,抛出异常,再执行另一个对数据库的写方法,伪代码如下:

@Transactional
public void func() {dao.write(pojo1);throw new Exception("异常");dao.write(pojo2);
}

要求此时事务全部回滚,即pojo1和pojo2都不写进数据库。

单元测试代码

@Test
public void testTransactional() {User user = new User();user.setUid(9);user.setUsername("李四");user.setPassword("234");userService.createAndUpdate(user);
}

不回滚写法

这种写法保留了createUser方法对数据库的写操作,而不执行UpdateUser方法,结果是把创建的User对象李四写进了数据库,但并没有重命名为admin。原因是抛出异常并捕获后,并没有触发事务回滚。所以代码结束后李四保留在了数据库中。

@Override
public void createAndUpdate(User user) {try {createUser(user);if (!user.getPassword().equals("123")) {throw new RuntimeException("密码不是123");}user.setUsername("admin");updateUser(user);} catch (Exception e) {e.printStackTrace();}
}

回滚写法

写法一:方法抛异常

这种写法可以在方法处抛出异常,也可以不抛出(throws RuntimeException可写可不写)。

@Override
public void createAndUpdate(User user) throws RuntimeException {createUser(user);if (!user.getPassword().equals("123")) {throw new RuntimeException("密码不是123");}user.setUsername("admin");updateUser(user);
}

写法二:try catch捕获异常

这种方法相比于不回滚的那种写法,只是在catch作用域内多加入了一行代码:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

完整方法:

@Override
public void createAndUpdate(User user) {try {createUser(user);if (!user.getPassword().equals("123")) {throw new RuntimeException("密码不是123");}user.setUsername("admin");updateUser(user);} catch (Exception e) {e.printStackTrace();TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}
}

代码抛出异常后进行事务回滚的两种方式(Spring @Transactional注解)相关推荐

  1. SQL事务回滚的两种方式

    1.XACT_ABORT 1)set XACT_ABORT off时,回滚产生错误的Transact-SQL语句,而事务将继续进行处理,(注:错误严重或者语法错误时可能回滚整个事务) 2) set X ...

  2. Java判断回文数(两种方式)

    Java判断回文数(两种方式) 回文数是一个非常特殊的数,它从左边读和从右边读是一样的.例如12321 判断方式有两种. 方式一:对该数字进行分解,然后一一比对,拆解成 1 2 3 2 1,然后第一位 ...

  3. git代码回滚的几种方式

    这还是第一次写关于git的文章,让我不由的想起了大学那会还没有接触到git时的如噩梦般的版本控制. 每次如果代码要有大的改动都要提前copy一份出来,最后以至于有多少次大的改动就有多少分文件,而且每一 ...

  4. GIt版本回滚的两种方法reset、revert

    在学习关于git版本回滚操作之前我们应该需熟练使用git log查看Git提交日志,同时也应学会使用git reflog查看Git提交日志. 可参考博客:git log的使用_WEB前端李志杰的博客- ...

  5. 创建二叉树的代码_解二叉树的右视图的两种方式

    给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 问题分析 这题说的很明白,就是站在一棵二叉树的右边,你所能看到的结点值.对于二叉树的遍历,前面有简单 ...

  6. 网页调用服务器视频代码,PPVOD视频系统调用视频地址播放的两种方式

    PPVOD视频系统系统的设计目标就是把各种格式的视频丢进去,系统自动处理变成可以在网页播放的的视频地址,为了用户个性化需要,我们系统生成了两种视频地址: 第一种就是分享地址 这个分享地址类似于优酷.奇 ...

  7. selenium中webdriver跳转新页面后定位置新页面的两种方式

    刚刚在写Python爬虫的时候用到了selenium , 在跳转新页面时发现无法定位新页面 , 查找不到新页面的元素 一番查询后得到了解决方法 , 便记录下来备忘 , 也与大家分享 # 页面跳转代码. ...

  8. java代码怎样连接es,Elasticsearch 连接ES的两种方式

    1.创建客户端节点来连接: 其中client(true)将node指定为客户端节点,所以这个不能写漏掉,客户端节点是不持有数据的, Java代码   Node node = NodeBuilder.n ...

  9. JS代码实现:鼠标悬停与离开(两种方式)

    第一种:普通方式 [demo07.html] <html> <head><link rel="stylesheet" href="css/d ...

  10. 经典代码-request请求获取参数(post和get两种方式)

    request请求获取参数(post和get两种方式) https://blog.csdn.net/u012110719/article/details/44672111

最新文章

  1. SBB:土壤微生物群落的特征究竟由什么决定
  2. python 文件路径格式化_python 存储为txt文件路径
  3. 转载【IDEA】向IntelliJ IDEA创建的项目导入Jar包的两种方式
  4. 远程登录另一个mysql 数据库_Ubuntu中开启MySQL远程访问功能,并将另一个数据库服务器中的数据迁移到新的服务器中...
  5. cocos2d-x游戏实例(7)-A星算法(3)
  6. 开源 java CMS - FreeCMS2.4 模型管理
  7. mac 删除php56 安装php72,mac php56升级php70
  8. 相机中影响成像质量的参数
  9. 一元多项式 java_java实现一元多项式加法
  10. 拓端tecdat|R语言多元逐步回归模型分析房价和葡萄酒价格:选择最合适的预测变量
  11. [2018.09.12 T1] 下落的圆盘
  12. 全国所有机场 sql表 (截至2021.1.25)绝对最全!!
  13. 结合读取opml ,把数据链接到treeview
  14. 薛定谔把妹法、量子力学和鸡汤(超长,慎入)
  15. 网页加速之Link prefetching
  16. Windows下通过Git上传项目至Github
  17. Windows安装Apache(解决问题Set the 'ServerName' directive globally to suppress this message)
  18. python打印实心菱形图案_python输入三角形三边求面积|python打印实心菱形图案
  19. 绘画教程:日式温泉场景怎么画?露天浴场的正确画法!
  20. 【继承系列】JS中的组合继承

热门文章

  1. 【2022】保姆级Android studio+JDK下载安装配置教程(带视频)
  2. PMP-专家判断、类比估算、参数估算、三点估算、自下而上估算、独立估算的区别
  3. 解决Rufus不会自动下载ldlinux.sys和ldlinux.bss文件问题
  4. python动态生成数据库表_ironpython – 如何通过python在Spotfire中动态创建数据表
  5. 如何利用手机的OCR文字识别功能制作扫描件?
  6. matlab进行多光栅衍射仿真,光栅衍射MATLAB仿真.docx
  7. R语言期末试题-重庆工商大学-统计学课程
  8. catia 桥接曲面圆角_CATIA建模教程_二_圆角及桥接在空间曲线中的应用
  9. GIF动画录制工具(写教程时用的比较小巧的gif工具)
  10. EXCEL VBA入门(课堂随机点名系统)