1

У нас есть два экземпляра оракула (две физические машины) и одна схема для нашего приложения. мы используем сервер приложений weblogic. приложение использует источник данных, для которого включена транзакция XA.java.sql.SQLException: не удалось использовать локальную транзакцию в глобальной транзакции

Я имею один боб управляемого EJB, где я делаю -

  1. обновления некоторые данные в таблице, а затем совершить
  2. отправить оракул Job
  3. снова обновить некоторые данные в таблице, а затем совершить

Здесь я получаю ошибку - java.sql.SQLException: не удалось использовать локальную транзакцию в глобальной транзакции.

странно эта ошибка не является обязательной для каждого исполнения, она отправляется 1 в 7-8 исполнениях.

Теперь мои вопросы

  1. Что значение боба управляемого транзакции, если я использую XA включен транзакцию?
  2. Почему это не встречается в каждом исполнении?

Спасибо.

ниже код -

DataObject.updateDataAndReturnCount(" UPDATE EOD_Trn_BatchProcess SET iJobNo = ?, szParameters = ? WHERE iProcessSeqNo = ? ", conn, new String[]{null, strParameters, (String)mapParameters.get("__PROCESS_SEQ_NO")}); 
conn.commit(); 

String strStatement = "{? = call submitProcAsJob(?, ?)}"; 
//String strStatement = "begin ? := submitProcAsJob(?, ?); end;"; 
CallableStatement pStmt = conn.prepareCall(strStatement); 
pStmt.registerOutParameter(1, OracleTypes.NUMBER); 
pStmt.setObject(2, strJobName); 
pStmt.setObject(3, strInstanceNo); 
pStmt.execute(); 
vString strJobNo = pStmt.getString(1); 
vpStmt.close(); 

DataObject.updateData(" UPDATE EOD_Trn_BatchProcess SET iJobNo = ?, szParameters = ? WHERE iProcessSeqNo = ? ", conn, new String[]{strJobNo, strParameters, (String)mapParameters.get("__PROCESS_SEQ_NO")}); 
conn.commit(); 

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

+0

Какой атрибут транзакции? Вы назвали commit/rollback в своем коде? Укажите код, который должен быть более ясным. –

+0

добавленный код, «атрибут транзакции», который имеет значение, означающее конфигурацию данных XA? – JackNJill

+0

Нет, в ejb-jar.xml trans-attribute контейнера-транзакции-> –

ответ

0

Я. (Или любую вещь вперед.) столкнулись с одной и той же проблемой, и когда я установил локальную транзакцию для автоматической фиксации ложной проблемы.

Connection.setAutoCommit(false) 

Я думаю, вы используете транзакцию с 2 фразами, что, если вы не совершаете в вас 1-й шаг?

+0

спасибо, я попробую это, но вы знаете, почему это не происходит в каждом исполнении. Также мне нужно использовать фиксацию, потому что мне нужно сохранить некоторые данные, неважно, что будет дальше. (Контрольная точка). – JackNJill

0

Причина исключения заключается в том, что вы не можете mannaully вызова фиксации()/отката в глобальной транзакции, вы можете только пометил его для rollback.You есть три варианта:

  1. сгенерирует исключение, который зависит от ejb-jar.xml/weblogic-ejb-jar.xml, по умолчанию для любого RuntimeException транзакция отмечена для отката;

  2. вызов метода EJBContext.setRollbackOnly() в случае CheckedException или когда вам нужно;

  3. Если ни одно из вышеприведенных событий не будет выполнено для всех ресурсов в рамках той же транзакции, оно будет совершено рано или поздно менеджером транзакций.

Менеджер транзакций несет ответственность за совершение()/откат() сделки для вас, так что у него есть шанс сотрудничать с различными ресурсами (два Oralce дБ, например).Вы можете проверить деталь на gooble ключевое слово «два фазированной сделки» или «глобальной транзакции», вот что я нашел: Global Transaction

Что касается вашего вопроса

  1. Что такое значение фасоли управляемого если я использую транзакцию с поддержкой XA?

    Операция, управляемая бобром, является «глобальной транзакцией», если атрибут транзакции в ejb-jar.xml разрешает распространение транзакции. Для глобальной транзакции необходим источник данных, который должен быть включен XA, то есть сам драйвер jdbc является драйвером типа XA, например, oracle.jdbc.xa.client.OracleXADataSource, или тонким драйвером oracle.jdbc.OracleDriver с поддержкой XA (имитация двух поэтапная сделка, но не реальная)

  2. Почему это не встречается в каждом исполнении?

    Я не знаю, почему, я думаю, драйвер есть какой-то механизм, чтобы проверить, является ли подданные является breaked.Or сделка-атрибут настроен на Поддержка, поэтому, если абонент имеет контекст транзакции, то Ваш EJB находится под глобальной транзакцией, иначе нет.

Желаю, чтобы мой ответ был полезным, удачи!

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

  • Нет связанных вопросов^_^