带有SQL-SERVER的WebSphere insert/update语句挂起,需要新的传播

带有SQL-SERVER的WebSphere insert/update语句挂起,需要新的传播,websphere,Websphere,在WebSphere上部署spring批处理应用程序时,我们面临一个问题 示例:一个类包含parent()方法,第二个类包含child()方法,其中child方法需要一个新事务。当事务被提交时,在执行这些方法之后,提交例程将挂起,并且不会进一步发生任何事情 @Transactional //using current transaction public void parent(){ child(); } @Transactional(propagation=REQUIRES_NEW)

在WebSphere上部署spring批处理应用程序时,我们面临一个问题

示例:一个类包含parent()方法,第二个类包含child()方法,其中child方法需要一个新事务。当事务被提交时,在执行这些方法之后,提交例程将挂起,并且不会进一步发生任何事情

@Transactional //using current transaction
public void parent(){
    child();
}

@Transactional(propagation=REQUIRES_NEW) //creates new transaction
public void child(){
//Database save statements including update, insert and deletes
}
这个问题只在WebSphere中存在,并且代码在我们使用tomcat作为web容器的本地机器上运行良好

WebSphereLogs/stacktrace显示WebSpherePrepared语句一直在等待来自数据库的响应。同时,受影响的表上的update和insert被锁定,即,如果我们在受影响的表上手动运行insert或update查询,则查询不会执行

我们使用SpringJPA进行数据持久化,使用Spring的JpaTransactionManager进行事务管理和MSSQLServer数据库


是否WebSphere不支持从现有事务创建新事务?

是的,您描述的模式受WebSphere Application Server支持。考虑到这涉及数据库中的锁定条目,您可能会在默认情况下使用事务隔离级别的应用程序服务器之间遇到差异。在WebSphereApplicationServer中,sql Server的默认值为java.sql.Connection.TRANSACTION\u REPEATABLE\u READ,而我认为在大多数其他情况下,最终的默认值为java.sql.Connection.TRANSACTION\u READ\u COMMITTED(较少锁定)。如果默认值有问题,可以在数据源配置中更改它

如果您使用的是WebSphere Application Server Liberty,那么可以在Server.xml中将默认隔离级别配置为dataSource元素的属性,如下所示

<dataSource isolationLevel="TRANSACTION_READ_COMMITTED" jndiName=...

谢谢,更改默认隔离级别解决了问题。