5

我目前正在使用 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:

为了解决这个问题,我必须做两件事:

  1. 更改代码顺序以首先开始用户事务,然后从数据存储区获取连接(正如 Pascal Thivent 所指出的)。

  2. 将 '"jdbc/xxxxx/DataSource"' 引用的数据源更改为 XADatasource。这是因为我在用户事务中调用的代码使用了另一个已经配置为支持 LLR 的数据源,正如 Pascal Thivent 在下面指出的那样,您只能让一个 LLR 数据源参与事务。

我在下面接受了 Pascal Thivent 的回答,因为它解释了这两个问题。

4

1 回答 1

2

是的,您的假设是正确的,并且根据Create LLR-enabled JDBC data sources,您的数据源似乎配置正确。

启动用户事务后是否获得连接?你能显示你的代码或伪代码吗?

更新:LLR 数据源的编程注意事项和限制中所述:

  • 使用 LLR 数据源进行编程时,必须在对 LLR 数据源调用 getConnection 之前启动全局事务。如果在启动全局事务之前调用 getConnection,则连接上的所有操作都将在全局事务之外进行。

那么,你可以试试这个:

transaction.begin(); //start the global tx before calling getConnection()
conn = dataSource.getConnection(); 
...
transaction.commit();

UPDATE2:不确定第二个连接是从哪里来的(你的伪代码没有显示这个)。但是,根据LLR 数据源的相同编程注意事项和限制

  • 只有单个 LLR 数据源的实例可以参与特定事务。单个 LLR 数据源可能在多个 WebLogic 服务器上有实例,如果两个数据源具有相同的配置名称,则它们被认为是相同的。如果检测到多个 LLR 数据源实例并且它们不是同一数据源的实例,则事务管理器将回滚该事务。

其实,没有一个完全有代表性的例子,我感觉有点像在黑暗中行走:)

于 2009-12-18T02:43:17.673 回答