JPA数据源Oracle异常记录

代码执行异常

ObjectOptimisticLockingFailureException

org.springframework.orm.ObjectOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1


如果在其他事务已经删除之后,开始执行deleteById方法,这个会提示Id对应的数据不存在,和上面报错不一样

JPA通过Dao接口(JPA自带的接口,@Query的方式不会)修改/删除Entity对象,Entity对象数据库数据被删除(其他线程已删除)引起的异常,这里的后面如果执行查询,然后报错点就会在这里。(JPA的查询貌似会开启事务,应该会加入之前的事务)

NOTransactionException

org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope

没有@Transaction注解修饰的方法调用了@Transaction方法,使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进行事务回滚,其他方法开启的事务会提交,但是会抛出异常。

InvalidDataAccessApiUsageException

org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query

方法调用PortReleaseStoreServiceImpl.savePortStore执行JPA删除/修改没有事务支持报错.。

JPA的dao接口update/delete SQL需要事务支持,否则就抛出上面的异常信息

必须要显示声明事务,或者调用它的Service有开启事务

JpaSystemException

could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.LockAcquisitionException: could not execute statement
org.springframework.orm.jpa.JpaSystemException: Transaction was marked for rollback only; cannot commit; nested exception is org.hibernate.TransactionException: Transaction was marked for rollback only; cannot commit

两个或多个进程(或事务)互相等待对方释放资源,导致它们无法继续执行下去的状态。

引发这个异常的原因有:

  1. 修改sql造成死锁
java 复制代码
if(flag1){
    tableDao1.update();
    tableDao2.update();
}else{
    tableDao2.update();
    tableDao1.update();
}
  1. A方法开启事务,在方法中通过dao执行数据库的写入操作,发生了异常,但是这个dao执行的方法异常被捕获了,导致了当前事务被标记回滚,A方法执行完成进行了事务的提交,所以出现了事务被标记rollback还提交事务的异常提示信息出现。dao层级引发的异常,就算异常被捕获,事务还是会被标记回滚。

UnexpectedRollbackException

一个Service开启了事务,调用另一个开始事务,事务隔离级别为Propagation.REQUIRED,默认加入之前的事务,后执行的事务使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();回滚事务,原来的Service在方法执行之后,不知道事务被设置为回滚,还需要提交事务,此时事务已经被回滚,会有异常提示。(事务被标记回滚,可是还是尝试去提交事务)



SQLSyntaxErrorException

使用SEQ自增主键,指定数据库方言错误。


Oracle错误代码

ORA-01756

ORA-01756: quoted string not properly terminated

引号字符串没有正确结束

String类型' 为成对

ORA-00936

ORA-00936: missing expression

sql语法错误,缺失必要表达式 select 缺少列,或者oracle数据库in查询没有列值。

ORA-01461

ORA-01461: can bind a LONG value only for insert into a LONG column

表中VARCHAR2(100)字段插入超过100字符串

ORA-00060 || SQLState:40001


获取排他锁:在默认的 READ COMMITTED 隔离级别下,当一个事务修改数据时,它会获取排他锁,这会阻止其他事务同时修改相同的数据。同时,其他事务可以在没有阻塞的情况下读取相同的数据,因为读取操作通常获取共享锁。

java 复制代码
if(flag1){
    tableDao1.update();
    tableDao2.update();
}else{
    tableDao2.update();
    tableDao1.update();
}

ORA-02201

使用MySQL的数据库方言,在这里不支持。

相关推荐
一只小青团2 小时前
Python之面向对象和类
java·开发语言
好奇的菜鸟2 小时前
Spring Boot 事务失效问题:同一个 Service 类中方法调用导致事务失效的原因及解决方案
数据库·spring boot·sql
qq_529835353 小时前
ThreadLocal内存泄漏 强引用vs弱引用
java·开发语言·jvm
落笔画忧愁e3 小时前
扣子Coze飞书多维表插件添加数据记录
java·服务器·飞书
岁岁岁平安3 小时前
Redis基础学习(五大值数据类型的常用操作命令)
数据库·redis·学习·redis list·redis hash·redis set·redis string
山海上的风4 小时前
Spring Batch终极指南:原理、实战与性能优化
spring·性能优化·batch·springbatch
小光学长5 小时前
基于vue框架的防疫科普网站0838x(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库
极限实验室5 小时前
使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建
数据库·docker·devops
秋千码途5 小时前
小架构step系列08:logback.xml的配置
xml·java·logback
飞翔的佩奇5 小时前
Java项目:基于SSM框架实现的旅游协会管理系统【ssm+B/S架构+源码+数据库+毕业论文】
java·数据库·mysql·毕业设计·ssm·旅游·jsp