本文共 2472 字,大约阅读时间需要 8 分钟。
')"'deployment和spring的事务管理是spring框架中非常重要的机制之一。在本节中,我们不仅将展示事务在何种情况下会自动回滚,还将探讨如何对事务进行友好的处理,让我们的应用在遇到问题时能够更加优雅地处理。
'事务在spring中默认是如何工作的?'
在我们上节中,已经对@Transactional注解做了详细说明。如果你还没有看过,可以跳过来看看。简单来说,spring的事务管理是一种轻量的事务管理方案,默认情况下它会在我们的方法调用中创建一个事务,这个事务会在正常的情况下提交,而在出现错误时自动回滚。
'让我们来看看一个简单的例子'
下面是一个简单的保存逻辑:
@Transactionalpublic void save() { Demo demo = Demo.builder() .id(uid()) .name("javayh") .adder("beijing") .build(); demoDao.save(demo);} 当我们启动项目并调用这个接口时,我们可以看到以下几点:
'当我们对代码进行修改后会发生什么?'
如果我们在保存逻辑中添加以下代码:
@Transactionalpublic void save() { Demo demo = Demo.builder() .id(uid()) .name("javayh") .adder("beijing") .build(); demoDao.save(demo); Integer.valueOf(demo.getAdder());} 当我们调用接口时会遇到以下情况:
'改进后的友好处理方式'
为了让我们的代码更加友好,我们可以在try-catch语句中进行处理:
@Transactionalpublic Boolean save() { Boolean flag = true; try { Demo demo = Demo.builder() .id(uid()) .name("javayh") .adder("beijing") .build(); demoDao.save(demo); Integer.valueOf(demo.getAdder()); } catch (RuntimeException e) { e.printStackTrace(); flag = false; throw new RuntimeException(); } return flag;} 我们发现通过抛出异常来处理事务问题,虽然对于客户端来说仍然不友好,但对于开发者和服务器来说,这是更容易处理的事务状态。
'手动设置事务回滚'
但我们还可以采取另一种方法:手动设置事务回滚而不抛出异常。这样可以让我们的调用接口更加友好:
@Transactionalpublic Boolean save() { Boolean flag = true; try { Demo demo = Demo.builder() .id(uid()) .name("javayh") .adder("beijing") .build(); demoDao.save(demo); Integer.valueOf(demo.getAdder()); } catch (RuntimeException e) { e.printStackTrace(); flag = false; TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // 或者继续抛出异常 throw new RuntimeException(); } return flag;} 通过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()我们可以手动设置事务为回滚状态,这种方法既保证了事务的正确性,又让我们的接口友好地返回状态,而不是突然报错。
'为什么这两种方式都有不同效果呢?''
其实两种方式都能达到事务回滚的效果,但效果有点不同:
'事务管理是很多开发者在日常工作中需要理解的核心概念之一'
事务的使用和处理可能看起来有点复杂,但只要理解了spring的事务管理机制和如何处理事务异常,就能更好地控制我们的应用程序的状态。这也是我们在编写高质量的代码时需要掌握的一点技能。'
通过这个课程,我们不仅学会了怎么配置事务,还学会了如何在应用遇到问题时优雅地处理事务,确保我们的系统在错误处理时依然可以保持良好的用户体验。
转载地址:http://undpz.baihongyu.com/