暂停交易是不是超时?
Posted
技术标签:
【中文标题】暂停交易是不是超时?【英文标题】:Do suspended transactions timeout?暂停交易是否超时? 【发布时间】:2018-08-17 19:06:00 【问题描述】:我有一个在 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()
...
我假设外部事务超时在暂停/暂停时停止,但 5 分钟后我仍然遇到事务超时错误。
看来暂停交易并不会影响其交易超时?该应用服务器是我们在 JEE 标准中定义的吗? 第三个问题是:您将如何解决这个问题?不开外部交易?增加该事务的超时时间(仅)?
令人费解的是,我读过的大多数交易文章甚至都没有提到这个事实。关于该主题的唯一提示是one blog post。
【问题讨论】:
【参考方案1】:AFAIK 你无法配置外部事务超时会发生什么。嵌套事务永远不会设置超时保持外部事务。如果您不想影响外部事务超时,则应该使内部事务异步。这样该方法将立即返回并且不会影响外部 tnx 超时。因此,在您的示例中,我将尝试使 importOneDataSet 异步。但是您应该知道,如果将其设为异步,则无法保持完整导入的一致性(即使您将 tnx 类型设置为所需的事务管理器,外部事务也无法回滚内部异步事务的工作,也无法在多个线程上保持相同的事务打开)。因此,如果您的完整导入必须保持一致,或者您必须保持数据集导入的顺序,最简单的解决方案将是增加导入的 tnx 时间。如果您的完全导入的超时时间太长(意味着在发生错误的情况下您会丢失太多工作),您应该划分您的大块并且只导入较小的工作块,您可以独立地重复单个工作块其他块万一出错。
【讨论】:
以上是关于暂停交易是不是超时?的主要内容,如果未能解决你的问题,请参考以下文章