Spring @Transaction在完成操作方法后回滚

时间:2017-08-07 07:21:33

标签: java spring hibernate jsf

我在辅助bean中为JSF中的操作按钮定义了一个方法。我使用Hibernate作为ORM。我能够保存新数据。但是当我尝试更新相同的数据时,会抛出事务回滚异常

javax.faces.FacesException: #{itemModificationBean.saveData('0','IM')}: org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
   at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
   at javax.faces.component.UICommand.broadcast(UICommand.java:315)
   at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
   at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
   at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
   at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
   at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
   at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
   at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:98)
   at 

我没有为该方法实现任何接口,而是在支持bean本身中调用和定义它。

有没有办法找出出错的地方?....

任何帮助将不胜感激

如果需要更多细节来详细说明问题,请告诉我

支持Bean

ItemBackingBean操作方法

@Transactional(readOnly=false, propagation=Propagation.REQUIRED)
public String saveData(String action, String app) throws WFException {

    setSaveOrSubmitStatus(action);
    setCurrentApp(app);
    //DB operations
    .
    .
    .
    .
    .
    return requestNo
}

组件

<p:commandButton value="#{msg.save}" type="submit" id="modifySav"
                        process="@form @this"
                        action="#{itemModificationBean.saveData('0','IM')}"
                        rendered="#{itemAttributeBean.getRenderedValue('modifySav')}"
                        update="@([id$=form]) @([id$=collectionTab])  @([id$=itemRequestDetailsGrid]) @([id$=saveDialogItemMod])"
                        style="float:right;" />

1 个答案:

答案 0 :(得分:0)

从你的堆栈跟踪中可以说是

  

交易已被标记为仅回滚

我会建议这些步骤:

  1. 确定交易开始的位置。由于您可能有不同的transactionPropagation策略,因此您需要找到它开始的第一个位置。
  2. 检查使用相同事务上下文的所有方法(执行期间传递事务的所有方法)并尝试获取导致事务回滚的异常:检查容器的事务回滚策略。 Spring例如在发生运行时异常时回滚(检查docs)。
  3. 找出它们的例外和原因,然后采取适当的行动。
  4. 从我从qestion详细信息中看到的,它可能是从您的支持bean saveData方法调用的方法,这些方法位于相同的事务上下文中。因此更新本身可能正常工作,但以前的方法调用已标记为当前事务仅作为回滚。检查他们的交易传播策略。

    我假设数据库操作之前的某些方法通过某种异常回滚事务或仅将事务显式标记为回滚。这些方法不会抛出异常,这就是程序流继续进行数据库操作方法调用的原因,但不能在同一个事务上下文中完成。