"存储过程'xxx'只能在非链式事务模式下运行." 在EJB上下文中从DataSource调用过程时出错

Gno*_*upi 1 java sybase jboss ejb-3.0

我们在Sybase中有一个数据库,我们可以从Java服务器访问它.

使用,直接通过Sybase驱动程序访问数据库DriverManager.它工作正常,我们能够调用我们的存储过程.

最近,我们正在迁移到应用程序服务器(在JBoss 5上),现在通过JNDI连接器调用数据库,使用DataSource:

Properties ppt = new Properties();
ppt.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
ppt.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
ppt.put("java.naming.provider.url", "jdbc/sybase");

InitialContext ctx = new InitialContext(ppt);
DataSource ds = (DataSource) ctx.lookup(AConfig.getInstance().getDatasourceJndiName());

Connection conn = ds.getConnection();
Run Code Online (Sandbox Code Playgroud)

(使用JBoss示例中的基本设置配置DataSource )

但是,在此设置中,有几个过程失败,出现此错误:

"存储过程' ** '只能在非链接事务模式下运行."

或者这种情况,对于其他情况(失败的命令改变):

多语句事务中不允许TRUNCATE TABLE命令

从我在互联网上发现的东西来看,它看起来像是JBoss中的东西,或者连接器本身正在打开一个事务,导致这些错误.因此,我能找到的针对这些特定问题的各种解决方案过于局部化,而且似乎是一个更大的问题.

有没有办法防止这种行为(假设这是实际问题)?


我在这个特定领域的知识非常薄,这对我来说是新的.因此,此描述可能缺少重要的细节.请指出我如何改进这个问题,如有必要,我可以添加哪些细节.

小智 6

显然,在Sybase中,存储过程是以链式或非链式模式运行的.

如果您收到此错误,则表示您的SP已创建为Unchained.此Java行conn.setAutoCommit(false);被翻译为"set chained on".

您可以运行此Sybase SP以列出数据库中所有SP的事务模式:

sp_procxmode
Run Code Online (Sandbox Code Playgroud)

因此,您需要在非链接模式下调用SP并显式使用,创建事务,提交事务和回滚事务.

例如:

insert into publishers 
    values ("9906", null, null, null)
begin transaction
delete from publishers where pub_id = "9906"
rollback transaction
Run Code Online (Sandbox Code Playgroud)

请参阅此链接.