Java TransactionAttributeType.REQUIRES\u新的带注释的方法是否会在新线程上运行?
根据,在容器管理的事务中,如果使用Java TransactionAttributeType.REQUIRES\u新的带注释的方法是否会在新线程上运行?,java,multithreading,transactions,jta,Java,Multithreading,Transactions,Jta,根据,在容器管理的事务中,如果使用TransactionAttributeType.REQUIRES\u NEW属性对方法进行注释,则将挂起任何客户端事务,委托对此方法的调用/创建新事务,并在新事务完成后恢复到以前的事务 因此,这实际上意味着没有创建新线程,并且在新线程完成之前,上一个事务处于“等待”状态?如中所述: 如果客户机使用事务上下文进行调用,则容器将在启动新事务和调用方法之前挂起事务上下文与当前线程的关联。容器在方法和新事务完成后恢复挂起的事务关联 它不是放弃线程或创建新线程,它只是释
TransactionAttributeType.REQUIRES\u NEW
属性对方法进行注释,则将挂起任何客户端事务,委托对此方法的调用/创建新事务,并在新事务完成后恢复到以前的事务
因此,这实际上意味着没有创建新线程,并且在新线程完成之前,上一个事务处于“等待”状态?如中所述:
如果客户机使用事务上下文进行调用,则容器将在启动新事务和调用方法之前挂起事务上下文与当前线程的关联。容器在方法和新事务完成后恢复挂起的事务关联
它不是放弃线程或创建新线程,它只是释放与事务的关联,然后重新创建它。如果它将创建一个新线程,则无需删除关联,因为它从未创建过。
容器管理事务
表示JTA
,而JTA
规范不允许跨多个线程执行事务。每个JTA事务都与一个执行线程相关联,因此这意味着在任何给定时间最多可以有一个事务处于活动状态。请注意,多个事务可以与单个线程关联,但在给定的时间内也只能有一个事务处于活动状态
由于JTA
不支持嵌套事务,这意味着如果一个事务处于活动状态,则不可能在同一线程中启动另一个事务,直到第一个事务提交或回滚(或超时,导致再次回滚),从而释放与当前线程的事务关联
当使用事务上下文调用具有事务属性的方法REQUIRES\u NEW
时,在幕后会发生什么?首先,JTA通过调用内部API临时挂起当前与调用线程关联的事务,特别是调用TransactionManager.suspend()
。(如果调用线程未与任何事务关联(即调用方法时,事务属性为不受支持
或没有事务上下文),则返回空对象引用)并获取事务
对象。一旦上述方法完成,此事务
对象将被传递到TransactionManager.resume()
方法,以将事务上下文与调用线程重新关联。无论是在同一个线程上还是在另一个线程上,都取决于JTA实现,因为规范明确要求它是一种方式还是另一种方式
回答您的问题-当在事务上下文中调用JTA时,JTA实现事务属性需要\u NEW
的唯一方法是从一个线程挂起事务,然后在同一个或另一个线程上恢复它。何时恢复?请记住,REQUIRES\u NEW
属性基本上意味着带注释的方法必须始终位于其自己的事务中,这反过来意味着该方法应该独立于调用堆栈上的方法提交或回滚。一旦调用了具有事务属性的方法,将恢复挂起的事务。该方法需要\u NEW
提交或回滚
作为旁注,您可能知道,Bean管理的事务
无法挂起事务,您不能通过编程来完成。只有JTA可以使用it的内部事务管理API实现这一点,您可以通过使用CMT
和事务属性以声明方式实现这一点。另请注意,此属性可能会导致过度使用事务管理费用。这意味着旧事务被阻止/等待新事务完成,对吗?确切地说,新事务完成后将继续。请注意一个常见的误解:这可能或极有可能,在方法返回后,挂起的事务(如果有)将不会“看到”由“REQUIRES_NEW”-事务所做的任何更改。