JTA该如何使用? 灵异现象
<%@ page import="java.sql.*,javax.sql.*,javax.transaction.*,javax.naming.*" %>
<%
InitialContext ctx = new InitialContext();
Object txObj = ctx.lookup("java:comp/UserTransaction");
UserTransaction utx = (UserTransaction) txObj;
utx.begin();
DataSource sol_ds = (DataSource)ctx.lookup("jdbc/sol");
Connection sol_conn = sol_ds.getConnection();
String sql = "insert into jta_tb1 values('sdf', 20)";
PreparedStatement pstmt;
pstmt = sol_conn.prepareStatement(sql);
pstmt.execute();
utx.commit();
sol_conn.close();
sol_ds = (DataSource)ctx.lookup("jdbc/sol");
sol_conn = sol_ds.getConnection();
sol_conn.setAutoCommit(false);
sql = "insert into jta_tb1 values('sdf', 20)";
pstmt = sol_conn.prepareStatement(sql);
pstmt.execute();
sol_conn.commit();
sol_conn.setAutoCommit(true);
sol_conn.close();
System.out.println("===========sdf");
%>
重复执行这段代码,总是奇数次成功,偶数次抛出异常....
异常如下:
[#|2007-04-17T14:49:37.819+0800|WARNING|sun-appserver-ee8.1_02|javax.enterprise.system.core.transaction|_ThreadID=14;|JTS5041:资源管理器正在处理全局事务以外的工作
oracle.jdbc.xa.OracleXAException
at oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:1190)
at oracle.jdbc.xa.client.OracleXAResource.start(OracleXAResource.java:311)
...
|#]
[#|2007-04-17T14:49:37.824+0800|WARNING|sun-appserver-ee8.1_02|javax.enterprise.resource.resourceadapter|_ThreadID=14;|销毁资源时发生错误:ORA-02089: COMMIT 不允许在附属会话中
|#]
[#|2007-04-17T14:49:38.067+0800|SEVERE|sun-appserver-ee8.1_02|javax.enterprise.system.container.web|_ThreadID=14;|StandardWrapperValve[jsp]: Servlet jsp 的 Servlet.service() 抛出异常
javax.transaction.RollbackException
at com.sun.jts.jta.TransactionManagerImpl.commit(TransactionManagerImpl.java:256)
at com.sun.enterprise.distributedtx.J2EETransactionManagerImpl.commit(J2EETransactionManagerImpl.java:943)
...