误用JAVA的异常类导致数据库中的事务不回滚

简介: 误用JAVA的异常类导致数据库中的事务不回滚

本来是在业务层已经使用了@Transaction注解,并且SpringBoot开启了事务管理器,但是下面的代码执行,还是不回滚,导致数据库进来了很多脏数据:

@Override@Transactional("transactionManager")
publicintcreateTest(NoteBookInfonoteBookInfo) throwsException  {
intret=noteBookInfoDaoImpl.create(noteBookInfo);
if(ret==1){
thrownewException("rollback");
    }
return0;
}

这里面有两个问题引起的,一个是对Spring的回滚异常不了解,一个是对Java的异常概念不了解,改成如下方式就可以了:

@Override@Transactional("transactionManager")
publicintcreateTest(NoteBookInfonoteBookInfo) throwsRuntimeException  {
intret=noteBookInfoDaoImpl.create(noteBookInfo);
if(ret==1){
thrownewRuntimeException("rollback");
    }
return0;
}

为什么RuntimeException可以,而Exception不可以,这里面主要是RuntimeException是unchecked类的,Exception不是unchecked的。而Spring的rollback要求的异常必须是unchecked。

/*** Defines zero (0) or more exception {@linkplain Class types}, which must be* subclasses of {@link Throwable}, indicating which exception types must cause* a transaction rollback.* <p>By default, a transaction will be rolled back on {@link RuntimeException}* and {@link Error} but not on checked exceptions (business exceptions). See* {@link org.springframework.transaction.interceptor.DefaultTransactionAttribute#rollbackOn(Throwable)}* for a detailed explanation.* <p>This is the preferred way to construct a rollback rule (in contrast to* {@link #rollbackForClassName}), matching the exception type and its subclasses* in a type-safe manner. See the {@linkplain Transactional class-level javadocs}* for further details on rollback rule semantics.* @see #rollbackForClassName* @see org.springframework.transaction.interceptor.RollbackRuleAttribute#RollbackRuleAttribute(Class)* @see org.springframework.transaction.interceptor.DefaultTransactionAttribute#rollbackOn(Throwable)*/Class<?extendsThrowable>[] rollbackFor() default {};

checked和unchecked的概念的区别简单的理解主要表现在编译器方面,编译器帮助你提示了就是checked的,比如FileNotFound,没提示的就是unchecked的,比如你代码跑起来以后,执行的时候报的NullPointException或者数组越界类的。JAVA的异常机制是一个大的体系,可以专门去学习了解。

目录
相关文章
|
17天前
|
存储 NoSQL Java
Java数据库编程指南:实现高效数据存储与访问
【4月更文挑战第2天】Java开发者必须掌握数据库编程,尤其是JDBC,它是连接数据库的标准接口。使用Spring JDBC或JPA能简化操作。选择合适的JDBC驱动,如MySQL Connector/J,对性能至关重要。最佳实践包括事务管理、防SQL注入、优化索引和数据库设计。NoSQL数据库如MongoDB也日益重要,Java有对应的驱动支持。理解这些概念和技术是构建高效数据库应用的基础。
Java数据库编程指南:实现高效数据存储与访问
|
2天前
|
Java 编译器
Java Character 类
4月更文挑战第13天
|
3天前
|
存储 Java
Java基础教程(7)-Java中的面向对象和类
【4月更文挑战第7天】Java是面向对象编程(OOP)语言,强调将事务抽象成对象。面向对象与面向过程的区别在于,前者通过对象间的交互解决问题,后者按步骤顺序执行。类是对象的模板,对象是类的实例。创建类使用`class`关键字,对象通过`new`运算符动态分配内存。方法包括构造函数和一般方法,构造函数用于对象初始化,一般方法处理逻辑。方法可以有0个或多个参数,可变参数用`类型...`定义。`this`关键字用于访问当前对象的属性。
|
3天前
|
SQL 缓存 Java
Java数据库连接池:优化数据库访问性能
【4月更文挑战第16天】本文探讨了Java数据库连接池的重要性和优势,它能减少延迟、提高效率并增强系统的可伸缩性和稳定性。通过选择如Apache DBCP、C3P0或HikariCP等连接池技术,并进行正确配置和集成,开发者可以优化数据库访问性能。此外,批处理、缓存、索引优化和SQL调整也是提升性能的有效手段。掌握数据库连接池的使用是优化Java企业级应用的关键。
|
7天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
10 0
|
7天前
|
Java
Java 15 神秘登场:隐藏类解析未知领域
Java 15 神秘登场:隐藏类解析未知领域
10 0
|
9天前
|
安全 Java
append在Java中是哪个类下的方法
append在Java中是哪个类下的方法
21 9
|
9天前
|
JavaScript Java 测试技术
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
25 0
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
|
10天前
|
存储 安全 Java
java多线程之原子操作类
java多线程之原子操作类
|
11天前
|
Java
Java中的异常类总结
Java中的异常类总结