Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 资源数据源在清除LocalTransactionContain时回滚_Java_Database_Oracle_Websphere_Datasource - Fatal编程技术网

Java 资源数据源在清除LocalTransactionContain时回滚

Java 资源数据源在清除LocalTransactionContain时回滚,java,database,oracle,websphere,datasource,Java,Database,Oracle,Websphere,Datasource,我在WebSphereApplicationServer7、JDK1.6和Oracle11g中工作 当使用ejb时,我总是收到这个错误 [7/1/10 17:12:28:770 BOT]00000013 LocalTranCoor W WLTC0033W:资源 jdbc/oraDS11在清理 LocalTransactionContainment。 [7/1/10 17:12:28:773 BOT]00000013 LocalTranCoor W WLTC0032W:一个或多个 需要更多的本地事

我在WebSphereApplicationServer7、JDK1.6和Oracle11g中工作

当使用ejb时,我总是收到这个错误

[7/1/10 17:12:28:770 BOT]00000013 LocalTranCoor W WLTC0033W:资源 jdbc/oraDS11在清理 LocalTransactionContainment。 [7/1/10 17:12:28:773 BOT]00000013 LocalTranCoor W WLTC0032W:一个或多个 需要更多的本地事务资源 在清理对象时回滚 LocalTransactionContainment

这就是我从WAS中的数据源获取连接的方式

javax.sql.DataSource ds = (javax.sql.DataSource) naming.lookup("DataSource");
conn= ds.getConnection();

如果您有任何帮助,我们将不胜感激。

从错误消息中可以看出,您正在本地事务中执行某些工作,没有提交它。未提交的工作由方法末尾的容器回滚(默认情况下)

这个答案很好地总结了这一切,因为解释它没有实际意义,我在下面引用它

一个
LocalTransactionContainment
是什么 你在没有一个全球性的 (XA)交易。信息 表示您执行了某些操作 本地交易是其中的一部分 包含范围(方法或活动) 然后,没有提交。这个 默认行为(由 未解决的操作)是回滚任何 结束时的未限制工作 范围您有许多选择:

  • 显式提交本地事务

    connection.commit(); // after the work has been performed
    
    Context ic = new InitialContext();
    UserTransaction ut =
    (UserTransaction) ic.lookup("java:comp/UserTransaction");
    ut.begin();
    // use connection here
    ut.commit();
    
  • 将数据源更改为使用自动提交

    connection.setAutoCommit(true); //
    
    在使用连接之前

  • 将工作放置在全局事务中

    connection.commit(); // after the work has been performed
    
    Context ic = new InitialContext();
    UserTransaction ut =
    (UserTransaction) ic.lookup("java:comp/UserTransaction");
    ut.begin();
    // use connection here
    ut.commit();
    
  • 将未解决的操作更改为提交
    选择上的“servlet”选项卡 部署描述符编辑器和 然后选择有问题的servlet。 在“WebSphere Extensions”下,然后 “本地事务”设置 从“未解决的操作”到“提交” 下拉菜单


我建议明确提交工作(并阅读整个答案)。

当表被锁定时会发生此异常,因此您已将表锁定在数据库中,所以请释放该锁并提交您所做的任何更改。

erm。。我已将未解决的操作更改为提交而不是回滚(默认)。。。而且,我所做的是一个简单的选择。。。我不必做任何选择后提交。。。消息出现在select之后。@Garis您确实必须在select之后提交(如链接中所述):在关闭之前,必须显式提交(或回滚)每个打开的连接。即使您对该连接所做的只是一个SELECT查询。这很有帮助!非常感谢。尽管connection.commit()或connection.setAutoCommit(true)是简单的解决方案,可以解决当前的问题。我将工作放在一个全局事务中,即@TransactionAttribute(TransactionAttribute.SUPPORTS)。这样,即使数据源实现更改为ConnectionPoolDataSource或Xadasource,应用程序代码也不应调用连接方法commit、rollback或setAutoCommit(true)。它将继续扩大规模。另请参考:docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html