В настоящее время я получаю как пользовательскую транзакцию, так и источник данных с сервера Weblogic 10.3 с использованием JNDI.
Я установил для источника данных значение «Поддержка глобальных транзакций» и для использования «Регистрация последнего ресурса»
Я надеялся, что при запуске UserTranscation, а затем при получении соединения JDBC из источника данных соединение будет участвовать в транзакции.
Похоже, что это не так, и мои операторы вставки сразу фиксируются, и откат транзакции не имеет никакого эффекта.
Верны ли мои предположения выше?
Может ли кто-нибудь указать мне направление какой-либо документации или образцов на то, как этого добиться?
Большое спасибо заранее
UPDATE:
В соответствии с запросом здесь приведен набросок кода, который я использую:
private void doSomething() {
Connection conn = null;
try {
Hashtable env = new java.util.Hashtable();
env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
env.put(javax.naming.Context.PROVIDER_URL,"t3://localhost:8080");
InitialContext ctx = InitialContext(env));
UserTransaction transaction = null;
transaction = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
DataSource dataSource = (DataSource) context.lookup("jdbc/xxxxx/DataSource");
conn = dataSource.getConnection();
transaction.begin();
// JDBC code goes here
transaction.commit();
} catch(Exception e) {
// TODO
if (transaction != null) {
try {
transaction.rollback();
} catch (Exception ex) {
// TODO
}
} finally {
if (con != null) {
conn.close
}
}
}
ОБНОВЛЕНИЕ 2:
Чтобы решить эту проблему, мне пришлось сделать 2 вещи:
Измените порядок кода, чтобы сначала начать пользовательскую транзакцию, а затем получить соединение из хранилища данных (как указал Паскаль Thivent).
Измените источник данных, на который ссылается «jdbc / xxxxx / DataSource», на XADatasource. Это связано с тем, что я вызывал код внутри пользовательской транзакции, которая использовала другой источник данных, который уже был настроен для поддержки LLR, и, как указывает Pascal Thivent ниже, в транскатации может участвовать только один источник данных LLR.
Я принял ответ Паскаля Тивента ниже, потому что он объяснил обе эти проблемы.