Увеличивается ли последовательность отмен оракула после отката транзакции? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть приложение Spring с Hibernate в качестве базы данных ORM и Oracle в качестве RDBMS.Предположим, что имя моей таблицы в базе данных entity_tbl, а entity_seq - последовательность моей таблицы.

В методе сохранения с @Transaction объект был сохранен, и после сохранения строки я выбрасываюисключение для транзакции отката.как показано ниже,

@Service
class EntityService extends GenericService<Entity>{

    @Autowired
    EntityRepository repo;

    @Transactional
    @Override
    public void save(Entity entity) {
       repo.save(entity);
       if(true)
           throw ApplicationException("just for Transaction rollback...")
    }
}

В консоли приложения я вижу следующую строку:

select entity_seq.nextval from dual

Если я выполню этот запрос на PL / SQL, entity_seq увеличится и entity_seq.currval будетновое значение.Но после отката транзакции в приведенном выше коде entity_seq.currval имеет прежнее значение и не увеличивается.

Поэтому мой вопрос: уменьшает ли Oracle последовательность после отката транзакции?или временная таблица оракула отменить это увеличение?или Hibernate справиться с этим?Другими словами, мой вопрос, почему последовательность после того, как я вижу select entity_seq.nextval from dual в консоли приложения, не изменилась?

Буду признателен за любую помощь!

1 Ответ

0 голосов
/ 04 марта 2019

Но после отката транзакции в приведенном выше коде entity_seq.currval имеет прежнее значение и не увеличивается.

currval никогда не увеличивает последовательность, в которой содержится последнее присвоенное значение, независимо от ROLLBACK.

Регистрация pure DB без заполнения ORM.

SQL> insert into tab(x)
  2  select seq.nextval from dual;

1 row created.

SQL> insert into tab(x)
  2  select seq.nextval from dual;

1 row created.

SQL>
SQL> select * from tab;

         X
----------
         1
         2

SQL>
SQL> select seq.currval from dual;

   CURRVAL
----------
         2

SQL>
SQL> rollback;

Rollback complete.

SQL>
SQL> select * from tab;

no rows selected

SQL>
SQL> select seq.currval from dual;

   CURRVAL
----------
         2

SQL>

Вы видите, что последнее присвоенное значение (2) возвращается из currval,Проверьте некоторые эффекты кэширования, если вы видите другие результаты.

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