Java当中让事务回滚的几种方式

 更新时间:2023年08月07日 09:37:32   作者:冷风扇666  
这篇文章主要给大家介绍了关于Java当中让事务回滚的几种方式, 事务回滚通常用于在某些操作失败时取消之前已执行的所有操作,这样,我们就可以保证数据的一致性,需要的朋友可以参考下

在 Java 中,可以通过使用事务来保证数据库操作的一致性和完整性。如果在事务过程中发生了异常或错误,需要将事务回滚,以保证数据的正确性和完整性。

下面是在 Java 中让事务回滚的几种方式:

使用 Spring 事务管理:在 Spring 中,可以使用 @Transactional 注解来标记需要进行事务管理的方法,同时可以设置 rollbackFor 属性指定回滚的异常类型。例如:

@Service
@Transactional(rollbackFor = Exception.class)
public class UserService {
    // ...
}

在上述代码中,@Transactional 注解指定了回滚的异常类型为 Exception,如果在 UserService 中出现了 Exception 类型的异常,就会回滚事务。

手动回滚事务:如果不使用 Spring 事务管理,可以手动回滚事务。例如:

Connection conn = dataSource.getConnection();
try {
    conn.setAutoCommit(false);
    // 执行数据库操作
    // 如果出现异常,手动回滚事务
    conn.rollback();
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    conn.setAutoCommit(true);
    conn.close();
}

在上述代码中,将数据库连接设置为手动提交模式,并在事务过程中根据需要执行数据库操作。如果出现异常,就手动回滚事务。总之,Java 中可以使用 Spring 事务管理或手动回滚事务等方式,来保证事务的一致性和完整性,并防止出现异常或错误时影响数据的正确性和完整性。

实现事务回滚需要注意的问题:

1.@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。

2.@Transactional 注解只能应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但是这个被注解的方法将不会展示已配置的事务设置。

3.默认情况下,spring会对unchecked异常进行事务回滚;如果是checked异常则不回滚。

如果事务在try{}catch(Exception e){e.printStackTrace();}中跑,并且catch中只是打印e的话,那么事务不会rollback。因为异常被catch掉了,框架不知道发生了常。

如果想要rollback,

(1)注解上面写明异常类型即可,@Transactional(rollbackFor=Exception.class) 

(2)在方法上添加 throws Exception,将方法中出现的异常抛出给spring事务 

(3)去掉方法体中的try catch 

(4)catch (Exception e) { throw e;}继续向上抛,目的是让spring事务捕获这个异常

除了以上注意的问题,说一下最近遇到的关于多数据源配置事务回滚的问题

在项目中关于事务该配置的也配置了,需要注意的问题也注意了,但有的事务可以出现回滚有的回滚失败,最终问题所在: id相同的事务配置分别配置在两个application.xml文件中,如果多个application.xml有配置,在web.xml中后加载的application.xml中的事务配置会覆盖最先加的application.xml中的事务配置。

总结

到此这篇关于Java当中让事务回滚的几种方式的文章就介绍到这了,更多相关Java事务回滚内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringMVC异常处理器编写及配置

    SpringMVC异常处理器编写及配置

    这篇文章主要介绍了SpringMVC异常处理器编写及配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Spring依赖注入多种类型数据的示例代码

    Spring依赖注入多种类型数据的示例代码

    这篇文章主要介绍了Spring依赖注入多种类型数据,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 使用SpringBoot集成Thymeleaf和Flying Saucer实现PDF导出

    使用SpringBoot集成Thymeleaf和Flying Saucer实现PDF导出

    在 Spring Boot 项目中,生成 PDF 报表或发票是常见需求,本文将介绍如何使用 Spring Boot 集成 Thymeleaf 模板引擎和 Flying Saucer 实现 PDF 导出,并提供详细的代码实现和常见问题解决方案,需要的朋友可以参考下
    2024-11-11
  • java使用des加密解密示例分享

    java使用des加密解密示例分享

    java使用des加密解密示例,适合java语言的所有平台,与.net等平台的加密解密兼容
    2014-02-02
  • 如何基于LoadingCache实现Java本地缓存

    如何基于LoadingCache实现Java本地缓存

    这篇文章主要介绍了如何基于LoadingCache实现Java本地缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringBoot之为何推荐使用构造器注入

    SpringBoot之为何推荐使用构造器注入

    这篇文章主要介绍了SpringBoot之为何推荐使用构造器注入问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Java中的LinkedHashSet和TreeSet解读

    Java中的LinkedHashSet和TreeSet解读

    这篇文章主要介绍了Java中的LinkedHashSet和TreeSet解读,哈希表和链表实现的set接口哈希表决定了它元素是唯一的,而链表则保证了他是有序的(存储和取出顺序一致),元素按照一定规则排序,不是按储存时间排的,需要的朋友可以参考下
    2023-09-09
  • Spring Security 自动踢掉前一个登录用户的实现代码

    Spring Security 自动踢掉前一个登录用户的实现代码

    这篇文章主要介绍了Spring Security 自动踢掉前一个登录用户的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Spring Boot多模块化后,服务间调用的坑及解决

    Spring Boot多模块化后,服务间调用的坑及解决

    这篇文章主要介绍了Spring Boot多模块化后,服务间调用的坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java 线程创建方式全过程

    Java 线程创建方式全过程

    本文介绍了继承Thread类、实现Runnable接口和Callable接口创建线程的方法,以及线程池的使用理逻辑和任务处理机制,并重点讲解了线程池参数配置、常用阻塞队列和拒绝策略、线程池的优势和应用场景、虚拟线程的特点和创建方法、ScheduledThreadPool线程池原理和使用方法
    2026-05-05

最新评论