事务在当前线程中不活动

时间:2016-11-28 21:42:36

标签: jpa glassfish jta

我一直收到错误消息当前线程中的事务处于活动状态,我想不出解决此问题的方法。在我按下应该发出将数据插入数据库的方法的按钮之前,这个错误一直发生在页面加载上。 下面我输入了我的代码:

Button1

该方法是从网页h:按钮调用的,这样一旦用户将他们的姓名和电话号码输入到文本框中,希望将这些文本框传递给数据库。如果这些信息有用,我也在使用glassfish服务器! 这也是错误页面上返回的堆栈跟踪的副本

    public String bookLesson(int lessonNo) throws Exception{
    try{
        Booking booking = new Booking();
        Lesson lesson = em.find(Lesson.class, lessonNo);
        booking.setLessonno(lesson);
        booking.setCustomername(customerName);
        booking.setCustomerphone(customerPhone);
        utx.begin();
        em.persist(booking);
        utx.commit();
    } catch (Exception e){
        utx.rollback();
        System.out.println(e);
    }
    return "lesson";
}

任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:0)

您应该在执行回滚之前检查事务状态,因为它会触发您的异常。
您可以使用public int getStatus() throws SystemException;界面中的TransactionManager方法 您可以将返回值与int接口关联的javax.transaction.Status值进行比较:

public final static int STATUS_ACTIVE= 0;

如果事务处于活动状态,则执行rollaback。否则,你就不能表演了 你可以这样做:

catch (Exception e){
        e.printStackTrace();
         // logger.error(e);  It is a better solution than logging in output.
        if (utx.getTransaction().getStatus()==Status.STATUS_ACTIVE){
           utx.rollback();
        }
    }