我目前正在使用 JNDI 从 Weblogic 10.3 服务器中检索 UserTransaction 和 DataSource。
我已将数据源设置为“支持全局事务”并使用“记录最后一个资源”
我希望通过开始一个 UserTranscation 然后从 Datasource 检索一个 JDBC 连接,该连接将参与 Transaction。
情况似乎并非如此,我的插入语句正在立即提交,回滚事务没有任何效果。
我的上述假设是否正确?
谁能指出我如何实现这一目标的一些文档或示例的方向?
提前谢谢了
更新:
根据要求,这里是我正在使用的代码的框架大纲:
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:
为了解决这个问题,我必须做两件事:
更改代码顺序以首先开始用户事务,然后从数据存储区获取连接(正如 Pascal Thivent 所指出的)。
将 '"jdbc/xxxxx/DataSource"' 引用的数据源更改为 XADatasource。这是因为我在用户事务中调用的代码使用了另一个已经配置为支持 LLR 的数据源,正如 Pascal Thivent 在下面指出的那样,您只能让一个 LLR 数据源参与事务。
我在下面接受了 Pascal Thivent 的回答,因为它解释了这两个问题。