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的数据库方言,在这里不支持。

相关推荐
普通网友5 分钟前
KUD#73019
java·php·程序优化
番茄Salad9 分钟前
自定义Spring Boot Starter项目并且在其他项目中通过pom引入使用
java·spring boot
JosieBook20 分钟前
【数据库】时序数据库选型指南:在大数据与工业4.0时代,为何 Apache IoTDB 成为智慧之选?
大数据·数据库·时序数据库
程序员三明治21 分钟前
详解Redis锁误删、原子性难题及Redisson加锁底层原理、WatchDog续约机制
java·数据库·redis·分布式锁·redisson·watchdog·看门狗
chenzhou__30 分钟前
MYSQL学习笔记(个人)(第十五天)
linux·数据库·笔记·学习·mysql
自由的疯31 分钟前
Java 怎么学习Kubernetes
java·后端·架构
自由的疯31 分钟前
Java kubernetes
java·后端·架构
一只自律的鸡1 小时前
【MySQL】第二章 基本的SELECT语句
数据库·mysql
普通网友1 小时前
IZT#73193
java·php·程序优化
rechol1 小时前
C++ 继承笔记
java·c++·笔记