本文主要是介绍Spring事务和事务传播机制(下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我们上一篇文章学习了 @Transactional 的基本使用。接下来我们学习 @Transactional 注解的使用细节。 @Transactional 注解当中有下面三个常见属性:
1、rollbackFor:异常回滚属性。指定能够触发事务回滚的异常类型。可以指定多个异常类型
2、IsoIation:事务的隔离级别。默认值为 IsoIation.DEFAULT。
3、propagation:事务的传播机制。默认值为:Propagation.REQUIRED
1. rollbackFor
@Transactional 默认只在遇到运行时异常和Error时才会回滚,非运行时异常不回滚(即Exception的子类中,除了 RuntimeException 及其子类,都不回滚)。继承关系图如下:
如下代码,我们把异常修改如下:
@Transactional@RequestMapping("/r2")public String r2(String userName, String password) throws IOException {Integer result = userService.insertUser(userName,password);log.info("数据插入成功, result:"+result);if (true){throw new IOException(); //事务提交}return "注册成功";}
浏览器访问http://127.0.0.1:8085/trans/r2?userName=wangyi&&password=111111,页面如下所示:
数据库却显示王奕的信息添加成功;
日志信息显示虽然发生异常了,但是信息却提交成功了;所以如果我们需要所有异常都回滚,需要来配置 @Transactional 注解当中的 rollbackFor属性,通过 rollbackFor 这个属性指定出现何种异常类型时,事务才会进行回滚。
在@transactional注解中添加rollbackfor属性,代码如下:
@Transactional(rollbackFor = {Exception.class})@RequestMapping("/r2")public String r2(String userName, String password) throws IOException {Integer result = userService.insertUser(userName,password);log.info("数据插入成功, result:"+result);if (true){throw new IOException(); //事务提交}return "注册成功";}
浏览器访问:http://127.0.0.1:8085/trans/r2?userName=zhoushiyu&&password=111111,发现事务没有被提交而是被进行回滚了;即周诗雨的数据没有成功的提交到数据库中;
结论:
1、在 Spring 的事务管理中,默认只在遇到运行时异常 RuntimeException 和 Error 时才会回滚。
2、如果需要回滚指定类型的异常,可以通过 rollbackFor 属性来指定。
这篇关于Spring事务和事务传播机制(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!