代码执行异常
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
两个或多个进程(或事务)互相等待对方释放资源,导致它们无法继续执行下去的状态。
引发这个异常的原因有:
- 修改sql造成死锁
if(flag1){
tableDao1.update();
tableDao2.update();
}else{
tableDao2.update();
tableDao1.update();
}
2. 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 隔离级别下,当一个事务修改数据时,它会获取排他锁,这会阻止其他事务同时修改相同的数据。同时,其他事务可以在没有阻塞的情况下读取相同的数据,因为读取操作通常获取共享锁。
if(flag1){
tableDao1.update();
tableDao2.update();
}else{
tableDao2.update();
tableDao1.update();
}
ORA-02201
使用MySQL的数据库方言,在这里不支持。