Ошибка удаления базы данных во время вставки - PullRequest
0 голосов
/ 06 сентября 2010

У меня есть два java-приложения: одно из них вставляет записи в Table1.Второе приложение читает первые N элементов и удаляет их.Когда 1-е приложение интенсивно вставляет данные, 2-е не удается, когда я пытаюсь удалить любые строки с CannotSerializeTransactionException.Я не вижу никаких проблем: вставленные элементы видны при выборе / удалении только после завершения транзакции вставки.Как я могу это исправить?Спасибо.

 TransactionTemplate tt = new  TransactionTemplate(platformTransactionManager);  
    tt.setIsolationLevel(Connection.TRANSACTION_SERIALIZABLE);
    tt.execute(new TransactionCallbackWithoutResult() {                
    @Override
    protected void doInTransactionWithoutResult(TransactionStatus status) {
        List<Record> records = getRecords(); // jdbc select
        if (!records.isEmpty()) {
           try {
              processRecords(records); // no database
              removeRecords(records); // jdbc delete - exception here
           } catch (CannotSerializeTransactionException e) {
                 log.info("Transaction rollback");
            }
         } else {
           pauseProcessing();
             }
        }
   });

pauseProcessing () - сон

public void removeRecords(int changeId) { String sql = "delete from RECORDS where ID <= ?";
        getJdbcTemplate().update(sql, new Object[]{changeId});}

Ответы [ 2 ]

1 голос
/ 06 сентября 2010

Используете ли вы Connection.TRANSACTION_SERIALIZABLE также в первом приложении? Похоже, что первое приложение блокирует таблицу, поэтому второе не может получить к ней доступ (не может начать транзакцию). Может быть, Connection.TRANSACTION_REPEATABLE_READ может быть достаточно?

Возможно, вы также можете настроить второе приложение, чтобы оно не выдавало исключение, когда оно не может получить доступ к ресурсам, а ожидало его.

0 голосов
/ 06 сентября 2010

Звучит так, как будто вы читаете незафиксированные данные. Вы уверены, что правильно настроили уровень изоляции?

Мне кажется, что вы смешиваете константы из двух разных классов: разве вы не должны передавать TransactionDefinition.ISOLATION_SERIALIZABLE вместо Connection.TRANSACTION_SERIALIZABLE в метод setIsolationLevel?

Почему вы все равно устанавливаете уровень изоляции? Уровень изоляции Oracle по умолчанию (чтение зафиксировано), как правило, является наилучшим компромиссом между согласованностью и скоростью и должен хорошо работать в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...