暂停的交易会超时吗?

Lon*_*zak 5 jboss transactions ejb-3.0 java-ee-7 jakarta-ee

我有一个在 JBOSS EAP 7 上运行的 JEE 应用程序。有一个长时间运行的异步方法可以将数据导入到另一个系统中。被触发后,它会在 5 分钟后遇到事务问题,这是 JBOSS 默认事务超时。到目前为止,一切都很好。我改变了行为(伪代码):

Before:
@Transactional(Required) //which is default
//The whole process takes usually longer than 5 min
void doImport{
 for(n-number of datsets){
   importOneDataSet();
 }
}

After:
@Transactional
void doImport{
 for(n-number of datsets){
   importOneDataSet();
 }
}
...
@Transactional(Requires_New) 
//a new transaction is created and the "outer" is suspended
//to import one dataset is below 5min
void importOneDataSet(){
...
}
Run Code Online (Sandbox Code Playgroud)

我假设外部事务超时在暂停/暂停时停止,但 5 分钟后我仍然遇到事务超时错误。

那么看来暂停交易并不会影响它的交易超时时间?该应用程序服务器是否特定于 JEE 标准中定义的?第三个问题是:你将如何解决这个问题?不开放外部交易吗?(仅)增加该事务的超时?

令人费解的是,我读过的大多数交易文章甚至没有提到这一事实。关于该主题的唯一提示是一篇博客文章

小智 2

AFAIK 您无法配置外部事务超时会发生什么。嵌套事务永远不会设置外部事务的暂停超时。如果您不想影响外部事务超时,则应该使内部事务异步。这样该方法将立即返回并且不会影响外部 tnx 超时。所以在你的例子中我会尝试使 importOneDataSet 异步。但您应该知道,如果将其设为异步,则无法保持完整导入的一致性(即使将 tnx 类型设置为所需的事务管理器,外部事务也无法回滚内部异步事务的工作,事务管理器无法在多个线程上保持同一事务打开)。因此,如果您的完整导入必须保持一致,或者如果您必须保持数据集导入的顺序,最简单的解决方案是增加导入的 tnx 超时。如果完全导入的超时时间太长(意味着万一发生错误,您会丢失太多工作),您应该划分大的工作,只导入较小的工作块,您可以独立于其他块重复单个工作块如果发生错误。