2013-09-04 5 views
1

Когда я пытаюсь вызвать процедуру из моего приложения получил сообщение об ошибке сказав ORA-01002: выборка из последовательностиORA-01002: выборка из последовательности при использовании @Transactional

технологии, используемые:

  • Mybatis 3
  • Spring MVC

интересный момент здесь ошибка возникает только в том случае, если я использую аннотацию для вызывающего метода в классе обслуживания @Transactional (org.springframework.transaction.annotation.Transactional). Если я удалю @Transactional, тогда нет ошибки ORA.

Я использую @Transactional, поскольку у меня есть несколько DAO, введенных в Сервис. Пожалуйста, найдите мой код, вставленный ниже.

@Transactional 
    public boolean saveavgFlyHrs(AverageFlyingHoursReport averageFlyingHoursReport) throws TransactionDataException { 
     String status = null; 
     boolean isOk = false; 
     if(averageFlyingHoursReportDAO.saveavgFlyHrs(averageFlyingHoursReport)) { 
      status = averageFlyingHoursReportDAO.updateCheckEff(averageFlyingHoursReport.getSubFleet()); 
      logger.debug("OUT_STATUS:"+status); 
      if(ConstantStringUtil.SUCCESS.equalsIgnoreCase(status)) { 
       isOk = true; 
      } else { 
       isOk = false; 
      } 
     } 
     return isOk; 
    } 

Любое PLS поможет мне с этим.

ответ

4

ORA-01002 - ошибка Oracle. Вы не указали код Oracle, поэтому нам нужно угадать, что происходит.

Эта ошибка обычно генерируется, когда вы совершаете через FOR UPDATE курсор, например:

SQL> CREATE TABLE TEST (ID NUMBER, c VARCHAR2(10)); 

Table created 

SQL> INSERT INTO TEST VALUES (1, 'a'); 

1 row inserted 

SQL> INSERT INTO TEST VALUES (2, 'b'); 

1 row inserted 

SQL> BEGIN 
    2  FOR cc IN (SELECT * FROM TEST FOR UPDATE) LOOP -- FOR UPDATE cursor 
    3  UPDATE TEST SET c = UPPER(c) WHERE ID = cc.id; 
    4  COMMIT; -- this will invalidate our cursor 
    5  END LOOP; 
    6 END; 
    7/

ORA-01002: fetch out of sequence 
ORA-06512: at line 3 

Я могу себе представить, что добавление @Transactional к единице работы сделает его фиксации на успех/откате ошибки. Так что, возможно, этот код является частью более крупного цикла, используя какой-то курсор FOR UPDATE. Когда вы добавляете @Transactional, он совершает каждый раз при вызове метода, тем самым аннулируя основной курсор.

Вы также можете столкнуться с ORA-01002, если вы пытаетесь извлечь из курсора после отката некоторые из изменений, которые сделали бы недействительными его:

SQL> DECLARE 
    2  CURSOR cc IS SELECT * FROM TEST; 
    3  rc cc%ROWTYPE; 
    4 BEGIN 
    5  UPDATE TEST SET c = 'c' WHERE ID = 2; 
    6  OPEN cc; 
    7  FETCH cc INTO rc; 
    8  -- do other things 
    9  ROLLBACK; 
10  FETCH cc INTO rc; 
11 END; 
12/

ORA-01002: fetch out of sequence 
ORA-06512: at line 11 

Здесь наш курсор cc аннулируется, потому что мы откатились некоторые изменений, которые влияют на строки в курсоре. Опять же это может быть вызвано добавлением @Transactional и методом отката транзакции, пока еще извлекается еще один курсор.

В заключение: вы должны добавить только @Transactional единицам, которые выполняют неделимую работу. Если этот метод является подметодом большей транзакции, он не должен совершать/откатываться самостоятельно.

+0

Hi Vincent, Отлично !! вы абсолютно правы. Спасибо за эти полезные объяснения. Я дал фиксацию в своей процедуре после каждого обновления, которое подпадает под описанный вами сценарий 1. Вы предлагаете удалить фиксацию из процедуры или удалить @Transactional? – prabu

+0

@prabu В идеале только основная программа должна решить, когда совершать, потому что только она знает, что представляет собой транзакцию. Я не уверен, что понимаю все тонкости '@ Transactional', но я думаю, что небольшие методы и подтемы не должны иметь этот атрибут, поскольку они не являются независимой транзакцией. Следуя той же логике, если у вас есть процедуры Oracle, они не должны фиксировать себя, они должны позволить клиенту (здесь вызывающее приложение) решать, когда/если совершить. –

+0

Спасибо Винсент !! Будет реализовываться, как было предложено вами, поскольку идея выглядит многообещающей. – prabu

Смежные вопросы