REPEATABLE_READ 在 Oracle 上使用 Spring 中的 JPA
REPEATABLE_READ on Oracle using JPA in Spring
当我尝试在 Oracle DB 上使用 spring 注释对 REPEATABLE_READ 设置隔离级别时,我得到:
java.sql.SQLException: READ_COMMITTED 和 SERIALIZABLE 是唯一有效的事务级别。 - (ORA-17030)
有办法解决这个问题吗?
@Transactional(isolation = Isolation.REPEATABLE_READ)
@Override
public List<ToMq> getAndChange1000NotForwarded() {
String queryText = "SELECT c FROM ToMq c WHERE c.forwarded = 0 AND";
TypedQuery<ToMq> query = em.createQuery(queryText, ToMq.class);
query.setMaxResults(1000);
List<ToMq> resultList = query.getResultList();
Date current = new Date();
for (ToMq toMq : resultList) {
toMq.setForwarded(Boolean.TRUE);
toMq.setForwardTimestamp(current);
}
save(resultList);
return resultList;
}
ORA-17030 错误消息是 Oracle JDBC 驱动程序产生的 JDBC 错误消息。根据 Oracle 11g 文档,支持以下数据库事务隔离级别:
- 已提交读取(默认)
- 可序列化
- 只读
因此无法强制使用 Oracle 数据库的 Repeatable-Read (ANSI/ISO) 隔离级别。
当我尝试在 Oracle DB 上使用 spring 注释对 REPEATABLE_READ 设置隔离级别时,我得到:
java.sql.SQLException: READ_COMMITTED 和 SERIALIZABLE 是唯一有效的事务级别。 - (ORA-17030)
有办法解决这个问题吗?
@Transactional(isolation = Isolation.REPEATABLE_READ)
@Override
public List<ToMq> getAndChange1000NotForwarded() {
String queryText = "SELECT c FROM ToMq c WHERE c.forwarded = 0 AND";
TypedQuery<ToMq> query = em.createQuery(queryText, ToMq.class);
query.setMaxResults(1000);
List<ToMq> resultList = query.getResultList();
Date current = new Date();
for (ToMq toMq : resultList) {
toMq.setForwarded(Boolean.TRUE);
toMq.setForwardTimestamp(current);
}
save(resultList);
return resultList;
}
ORA-17030 错误消息是 Oracle JDBC 驱动程序产生的 JDBC 错误消息。根据 Oracle 11g 文档,支持以下数据库事务隔离级别:
- 已提交读取(默认)
- 可序列化
- 只读
因此无法强制使用 Oracle 数据库的 Repeatable-Read (ANSI/ISO) 隔离级别。