it-roy-ru.com

Spring Batch ORA-08177: невозможно сериализовать доступ для этой транзакции при выполнении одного задания, уровень изоляции SERIALIZED

Я получаю это исключение с СЕРИАЛИЗИРОВАННЫМ уровнем изоляции на JobRepository в Spring Batch:

org.springframework.dao.CannotSerializeTransactionException: PreparedStatementCallback; SQL [INSERT into DATAFEED_APP.BATCH_JOB_INSTANCE(JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION) values (?, ?, ?, ?)]; ORA-08177: can't serialize access for this transaction

; вложенное исключение - Java.sql.SQLException: ORA-08177: не может сериализовать доступ для этой транзакции

at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.Java:269)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.Java:72)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.Java:603)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.Java:812)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.Java:868)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.Java:872)
at org.springframework.batch.core.repository.dao.JdbcJobInstanceDao.createJobInstance(JdbcJobInstanceDao.Java:105)
at org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.Java:135)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
at Java.lang.reflect.Method.invoke(Method.Java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.Java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.Java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.Java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
at org.springframework.batch.core.repository.support.AbstractJobRepositoryFactoryBean$1.invoke(AbstractJobRepositoryFactoryBean.Java:172)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.Java:204)
at $Proxy27.createJobExecution(Unknown Source)
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.Java:124)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
at Java.lang.reflect.Method.invoke(Method.Java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.Java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.Java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:150)
at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.Java:117)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.Java:204)
at $Proxy61.run(Unknown Source)

при выполнении только одной работы, ничего параллельно. Когда я изменяю уровень изоляции для JobRepository на ISOLATION_READ_COMMITTED, исключение исчезает.

В чем причина этого исключения? 

17
padis

С официальный документ - 4.3.1

Уровень изоляции по умолчанию для этого метода - SERIALIZABLE, то есть довольно агрессивно: READ_COMMITTED будет работать так же хорошо; READ_UNCOMMITTED было бы хорошо, если два процесса вряд ли столкнуться таким образом. Однако, поскольку вызов метода create * - довольно коротко, маловероятно, что SERIALIZED вызовет проблемы, пока платформа базы данных поддерживает это.

8
Luca Basso Ricci

У меня была та же проблема, и эффективно изоляция на уровне jobRepository является ключом, вот пример кода, который работает для меня:

<batch:job-repository id="jobRepository"
    data-source="dataSource" transaction-manager="transactionManager"
    isolation-level-for-create="READ_COMMITTED" table-prefix="SB_" />   
6
ingchristianreyes

При использовании сериализованных транзакций вам необходимо увеличить параметр initrans в таблице в соответствии с Oracle Docs . Для обработки сериализованных транзакций это должно быть 3 или более.

alter table BATCH_.... INITRANS 3
4
mpkorstanje

Мы попытались поднять INI_TRANS до 100, и у нас все еще были проблемы 

Я нашел эту статью, которая предлагает добавить ROWDEPENDENCIES для создания таблиц.

http://www.devx.com/dbzone/Article/41591?pf=true

Для меня с INI_TRANS & теперь ROWDEPENDENCIES исключения для Сериализованного исчезли.

Обновление: оказывается не идеальным решением. У нас было одно событие этого СЕРИАЛИЗИРОВАННОГО исключения за одну ночь. Теперь это намного лучше, так как у нас было сотни прогонов до одного сбоя, но кажется, что использование ROWDEPENDENCIES еще не является полным решением.

3
grbonk

У меня есть обходной путь для этой проблемы.

Следуйте ниже шаг.

  1. Вручную создайте таблицу в вашей базе данных ( Ссылка ).
  2. вставьте несколько фиктивных записей в таблицу BATCH_JOB_INSTANCE, BATCH_JOB_EXECUTION и BATCH_JOB_EXECUTION_PARAMS. (не забудьте совершить)
  3. Ошибка устранена. наслаждаться.
0
Raj Kumar Gupta

Мне удалось устранить эту ошибку, добавив изоляцию LevelForCreate, как показано ниже:

<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
        <property name="databaseType" value="Oracle"/>
        <property name="dataSource" ref="dataSource" />
        <property name="transactionManager" ref="transactionManager" />
        <property name="isolationLevelForCreate" value="ISOLATION_READ_UNCOMMITTED"/>
    </bean>
0
Bajal