oracle - 无法将此事务的访问序列化并隔离为 ISOLATION_READ_UNCOMMITTED
问题描述
使用 spring-batch,我有 2 个数据源:一个用于 spring 批处理调用centralDataSource
,一个用于业务调用localDataSource
。
我已将隔离级别设置为 ISOLATION_READ_UNCOMMITTED 以避免并发事务出现如下问题。
@Bean
public Job myJob(Step firstStep,
Step secondStep,
JobCompletionNotificationListener listener,
JobRepository customJobRepository) {
return jobBuilderFactory.get("my-job")
.repository(customJobRepository)
.listener(listener)
.incrementer(new RunIdIncrementer())
.start(firstStep)
.next(secondStep)
.build();
}
@Bean
public JobRepository customJobRepository(
@Qualifier("centralDataSource") DataSource centralDataSource,
@Qualifier("centralTransactionManager") PlatformTransactionManager centralTransactionManager)
throws Exception {
JobRepositoryFactoryBean factoryBean = new JobRepositoryFactoryBean();
factoryBean.setDatabaseType("ORACLE");
factoryBean.setDataSource(centralDataSource);
factoryBean.setTransactionManager(centralTransactionManager);
factoryBean.setIsolationLevelForCreate("ISOLATION_READ_UNCOMMITTED");
return factoryBean.getObject();
}
我还有Application run failed
。SQLException: ORA-08177: can’t serialize access for this transaction
我不明白为什么。甚至没有2个并发的 spring 批处理作业同时运行。作业是按顺序运行的,为什么会发生这种情况,我该如何解决?
谁能帮我 ?
解决方案
我不知道 Spring 以及它如何更改事务隔离级别,但是:
一、Oracle数据库不支持READ_UNCOMMITTED隔离级别:
alter session set isolation_level=read_uncommitted
*
ERROR at line 1:
ORA-02183: valid options: ISOLATION_LEVEL { SERIALIZABLE | READ COMMITTED }
其次,如果您有 ORA-8177,则表示您正在使用 SERIALIZABLE 隔离级别。
$ oerr ora 8177
08177, 00000, "can't serialize access for this transaction"
// *Cause: Encountered data changed by an operation that occurred after
// the start of this serializable transaction.
// *Action: In read/write transactions, retry the intended operation or
// transaction.
您需要检查 Spring 运行了哪些 ALTER SESSION 语句来更改隔离级别。
推荐阅读
- ssh - 来自共享 Gitlab 运行器的 SSH 停止工作
- reactjs - React useEffect 和 React-Router - 当用户导航到新页面时,在组件中重新发送 API 调用
- html - 全屏视频 iOs 设备
- get - 如何在邮递员获取请求的查询参数中发送字符串数组
- html - 如何在 ReactJS 中使用 CSS 设置背景图像后的 h1
- r - 基于长列表将列添加到数据框中,另一列中的值太慢
- docker - Heroku env 变量 $DATABASE_URL 和 $PORT 没有显示在 dyno (heroku ps:exec)
- highcharts - 如何在highcharts甘特图中将条形工具提示显示为默认值?
- python - 意外类型“标准按钮”PyQt5 消息框
- reactjs - 如何在 React 中创建可重用的自定义模态组件?