在Hibernate for Sybase DB中的多语句事务中不允许使用SELECT INTO命令

时间:2014-02-06 14:29:18

标签: java sql hibernate sybase sybase-ase

我是hibernate的新手,并尝试使用hibernate从一个Java文件执行一个过程到一个Sybase数据库。当我试图运行应用程序时,我收到如下错误

存储过程'dbo.p_chklist_test'只能在非链式事务模式下运行。 'SET CHAINED OFF'命令将使当前会话使用非链式交易模式。

我已经在几个论坛中检查并通过运行以下命令将模式设置为“任何模式”。 sp_procxmode p_chklist_test,“anymode”

我也在hibernate中将Auto Commit设置为False。

现在我收到一个不同的错误,如下面

Caused by: org.hibernate.exception.GenericJDBCException: could not execute native bulk manipulation query
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:198)
    at org.hibernate.impl.SessionImpl.executeNativeUpdate(SessionImpl.java:1191)
    at org.hibernate.impl.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:357)
    at com.lcit_release.server.dao.ReleaseItemDao.searchRecordsNew(ReleaseItemDao.java:198)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy8.searchRecordsNew(Unknown Source)
    at com.lcit_release.server.logic.ReleaseItemLogic.searchExisting(ReleaseItemLogic.java:147)
    at com.lcit_release.server.adapter.ReleaseItemLogicAdapter.search(ReleaseItemLogicAdapter.java:79)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569)
    ... 41 more


**Caused by: com.sybase.jdbc3.jdbc.SybSQLException: SELECT INTO command not allowed within multi-statement transaction.**

    at com.sybase.jdbc3.tds.Tds.a(Unknown Source)
    at com.sybase.jdbc3.tds.Tds.nextResult(Unknown Source)
    at com.sybase.jdbc3.jdbc.ResultGetter.nextResult(Unknown Source)
    at com.sybase.jdbc3.jdbc.SybStatement.nextResult(Unknown Source)
    at com.sybase.jdbc3.jdbc.SybStatement.nextResult(Unknown Source)
    at com.sybase.jdbc3.jdbc.SybStatement.updateLoop(Unknown Source)
    at com.sybase.jdbc3.jdbc.SybStatement.executeUpdate(Unknown Source)
    at com.sybase.jdbc3.jdbc.SybPreparedStatement.executeUpdate(Unknown Source)
    at msjava.tools.db.jdbc3.MSDBPreparedStatementImpl.executeUpdate(MSDBPreparedStatementImpl.java:315)
    at msjava.tools.db.jdbc3.MSDBPreparedStatement.executeUpdate(MSDBPreparedStatement.java:78)
    at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:189)
    ... 62 more

我检查了几个站点,错误多语句事务中不允许SELECT INTO命令,并在配置xml中将参数“ServerInitiatedTransactions”设置为false

**<ConnectProperties>
    <Property name="ServerInitiatedTransactions">false</Property>
</ConnectProperties>**  

但是这个甚至dint解决了这个问题,我得到了同样的错误。有人可以帮我这个。

我的代码:

 String sql3 ="exec dbo.p_chklist_test";
         System.out.println("sql 3 is "+sql3);

            Query query = sessionFactory.getCurrentSession().createSQLQuery(sql3);


             sessionFactory.getCurrentSession().connection().setAutoCommit(false);



         query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);


         listRelItem = query.list();

提前致谢!

4 个答案:

答案 0 :(得分:2)

请检查您的存储过程是否有

等语句

SELECT id INTO #a FROM students。

从DB角度来看,这个陈述是可以的,但是当从Java程序执行时,这将不起作用并给出上述错误。

首先,定义临时表

创建表#a( id INT )

INSERT INTO #a SELECT id FROM students

上述修复工作正常。

答案 1 :(得分:1)

我已通过以下方式调用该过程解决了该问题。希望它可以帮助其他人解决问题。

SET CHAINED OFF exec p_qa_existing_items

答案 2 :(得分:0)

可能这是因为你应该&#34;永远不会&#34;尝试使用&#34;选择进入&#34;当一个事务(选择@@ transaction)打开时,从任何平台Java或任何其他应用程序调用它。

我相信@swat提供的解决方案几乎应该使用而不是SET CHAINED OFF。由于这一点可能会产生影响因为我知道SET CHAINED由于某种原因而打开了。因此,当需要打开一个事务但SP> CHAINED为ON时,SP中可能没有任何代码。

您可以在Sybase中使用它 -

创建proc testproc 如 从表中选择*到#temp 返回 去

开始tran exec test_proc commit tran

开始tran exec test_proc rollback tran

(我现在没有我的Sybase环境,所以不能自己检查。但这肯定能帮助你理解原因)

答案 3 :(得分:0)

我在使用Jboss时遇到了同样的问题,我无法更改程序,因为它是由客户端提供的。在我的情况下,在配置数据源以使用

后问题停止了
jta="false".