我们有两个oracle实例(两个物理机器)和一个应用程序模式。我们正在使用weblogic应用服务器。应用程序使用启用XA事务的数据源。
我有一个bean管理的EJB,在那里我做-
在这里,我得到了错误- java.sql.SQLException:无法在全局事务中使用本地事务提交。
奇怪的是,这个错误并不是每次执行都会发生,而是在7-8次执行中执行1次.
现在我的问题是
谢谢。
下面是代码-
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();这里需要首先提交,因为我希望保存调用期间使用的参数,即使作业提交失败。(或前面的任何事情)。
发布于 2013-03-21 02:05:58
异常的原因是您不能在全局事务下手动调用commit()/rollback,您只能将其标记为rollback.You有三个选项:
事务管理器为您负责提交()/rollback()事务,以便它有机会与不同的资源(例如两个oralce db )合作,.You可以通过gooble检查细节--关键词是“两个分阶段事务”或“全局事务”,下面是我发现的:全局事务。
至于你的问题
祝我的回答有帮助,祝你好运!
发布于 2013-03-19 14:31:53
我也遇到过同样的问题,当我将本地事务设置为自动提交假时,问题就解决了。
Connection.setAutoCommit(false)我想您使用的是一个2阶段的事务,如果您在第一步中不提交怎么办?
https://stackoverflow.com/questions/15501655
复制相似问题