博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【快学springboot】9.使用 @Transactional 注解配置事务管理
阅读量:7171 次
发布时间:2019-06-29

本文共 1953 字,大约阅读时间需要 6 分钟。

介绍

springboot对数据库事务的使用非常的方便,只需要在方法上添加@Transactional注解即可。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。

使用Transactional注解

Transactional注解使用起来是非常简单的,只需要在相应的方法上面标识Transactional注解即可。

下面通过一个简单的例子演示Transaction注解的使用

@Transactional@Overridepublic void addUser() { User user1 = new User(); user1.setUsername("happyjava1"); user1.setPassword("123456"); userRepo.save(user1); int i = 1 / 0; User user2 = new User(); user2.setUsername("happyjava2"); user2.setPassword("123456"); userRepo.save(user2);}复制代码

这里保存两个用户,然后通过 1/0 的方式使程序出现异常。通过一个测试方法测试:

@Testpublic void testTx() { userService.addUser();}复制代码

如果数据库没有user1这条记录,说明事物是起作用了的。

执行结果是预期的报错了。

数据库也没有jappyjava1这个字段。说明Transactional注解起作用了。

Transactional注解通过noRollbackFor配置不回滚的异常

Transactional注解可以配置发生某个异常时不进行回滚。比如我在Transaction注解上添加如下属性,指定ArithmeticException不进行事务的回滚。

@Transactional(noRollbackFor = ArithmeticException.class)复制代码

再次运行测试方法。

依然报错了,但是查看数据库,user1这条记录已经插入数据库了。

通过propagation属性配置事务的传播行为

事务的传播行为,默认值为 Propagation.REQUIRED。可以手动指定其他的事务传播行为,如下:

  • Propagation.REQUIRED

如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。

  • Propagation.SUPPORTS

如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。

  • Propagation.MANDATORY

如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。

  • Propagation.REQUIRES_NEW

重新创建一个新的事务,如果当前存在事务,暂停当前的事务。

  • Propagation.NOT_SUPPORTED

以非事务的方式运行,如果当前存在事务,暂停当前的事务。

  • Propagation.NEVER

以非事务的方式运行,如果当前存在事务,则抛出异常。

  • Propagation.NESTED

如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。

通过isolation 属性配置事务的隔离级别

事务的隔离级别,默认值为 Isolation.DEFAULT,这个跟数据库的隔离级别有关系。可以自定义隔离级别,如下:

  • Isolation.DEFAULT
  • Isolation.READ_UNCOMMITTED
  • Isolation.READ_COMMITTED
  • Isolation.REPEATABLE_READ
  • Isolation.SERIALIZABLE

事务的传播行为和隔离级别是比较抽象的东西,本文作为springboot的教程课程暂且不做探讨,等后续有时间会再写文章做探讨。

timeout 属性

事务的超时时间,默认值为-1。如果设置了该时间,超过该时间限制但事务还没有完成,则自动回滚事务。

总结

本文只是介绍了springboot可以通过Transactional注解,快速的配置事务管理。数据库事务,是一个很复杂的东西,如果要讲清楚,就不应该放在一篇springboot相关的文章中进行讲解,后续会再起篇幅,单独讲讲事务相关的东西。

转载于:https://juejin.im/post/5d05e723f265da1b5f26544f

你可能感兴趣的文章
Oracle 11g 新特性简介(二)
查看>>
Office 2019 & Office 2016 下载地址
查看>>
tomcat应用转到weblogic上时的问题
查看>>
国外程序员是如何准备面试的
查看>>
使用maatkit工具检查并同步mysql主从数据
查看>>
Zookeeper监控之——node-zk-browser
查看>>
我的友情链接
查看>>
10个最酷的linux单行命令
查看>>
【MySQL运维】解决由于中继日志报错导致主从故障一例
查看>>
myeclipse 10 在mac retina 屏幕下显示字体模糊解决方法
查看>>
创建自定义的指令
查看>>
javascript对象中判断属性
查看>>
git删除分支与合并分支
查看>>
Python元组
查看>>
HD TUNE以及所有其他硬盘检测工具都不能使用的情况
查看>>
Linux内存分析
查看>>
vSphere 5.5 vCenter迁移至分布式交换机
查看>>
排序 遍历
查看>>
第二次作业
查看>>
Mysql主从复制
查看>>