0 Replies Latest reply on Dec 12, 2008 8:47 PM by sarnac

    SQL being executed outside of transaction boundaries

    sarnac

      Hi all,


      I am running the JPA Booking example on a PostgreSQL database and it seems that some of the generated SQL is being executed outside of the Seam transaction boundaries. I haven't changed anything in the example except the datasource and JDBC driver, which is PostrgeSQL instead of the default Hypersonic.


      I have found this while looking at the logs, which I have configured as such:


          <logger name="org.hibernate.SQL">
              <level value="DEBUG"/>
          </logger>
         
          <logger name="org.jboss.seam.transaction">
              <level value="DEBUG"/>
          </logger>   
          
          <logger name="org.jboss.seam.contexts.FacesLifecycle">
              <level value="DEBUG"/>
          </logger>
          
          <logger name="org.jboss.seam.jsf">
              <level value="DEBUG"/>
          </logger>
      



      With this logging configuration, the following logs are produced when I confirm a Booking in the example application:


      2008-12-12 13:57:07,910 DEBUG [org.jboss.seam.contexts.FacesLifecycle] >>> Begin JSF request for /jboss-seam-jpa/confirm.seam
      2008-12-12 13:57:07,914 DEBUG [org.jboss.seam.jsf.SeamPhaseListener] beginning transaction prior to phase: APPLY_REQUEST_VALUES 2
      2008-12-12 13:57:07,914 DEBUG [org.jboss.seam.transaction.EntityTransaction] beginning JPA resource-local transaction
      2008-12-12 13:57:07,917 DEBUG [org.jboss.seam.transaction.EntityTransaction] registering synchronization: ManagedPersistenceContext(java:/em)
      2008-12-12 13:57:07,919 DEBUG [org.hibernate.SQL] 
          select
              nextval ('hibernate_sequence')
      2008-12-12 13:57:07,921 DEBUG [org.hibernate.SQL] 
          select
              user_.username,
              user_.name as name478_,
              user_.password as password478_ 
          from
              Customer user_ 
          where
              user_.username=?
      2008-12-12 13:57:07,975 INFO  [org.jboss.seam.example.jpa.HotelBookingAction] New booking: 1 for demo
      2008-12-12 13:57:07,995 DEBUG [org.jboss.seam.transaction.EntityTransaction] registering synchronization: TransactionSuccessEvent(bookingConfirmed)
      2008-12-12 13:57:07,996 DEBUG [org.jboss.seam.jsf.SeamPhaseListener] committing transaction after phase: INVOKE_APPLICATION 5
      2008-12-12 13:57:07,996 DEBUG [org.jboss.seam.transaction.EntityTransaction] committing JPA resource-local transaction
      2008-12-12 13:57:07,998 DEBUG [org.hibernate.SQL] 
          insert 
          into
              Booking
              (user_username, checkinDate, hotel_id, checkoutDate, creditCard, smoking, beds, creditCardName, creditCardExpiryMonth, creditCardExpiryYear, id) 
          values
              (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
      2008-12-12 13:57:08,480 DEBUG [org.jboss.seam.transaction.EntityTransaction] beginning JPA resource-local transaction
      2008-12-12 13:57:08,480 DEBUG [org.jboss.seam.transaction.EntityTransaction] registering synchronization: ManagedPersistenceContext(java:/em)
      2008-12-12 13:57:08,482 DEBUG [org.hibernate.SQL] 
          select
              booking0_.id as id477_,
              booking0_.user_username as user11_477_,
              booking0_.checkinDate as checkinD2_477_,
              booking0_.hotel_id as hotel10_477_,
              booking0_.checkoutDate as checkout3_477_,
              booking0_.creditCard as creditCard477_,
              booking0_.smoking as smoking477_,
              booking0_.beds as beds477_,
              booking0_.creditCardName as creditCa7_477_,
              booking0_.creditCardExpiryMonth as creditCa8_477_,
              booking0_.creditCardExpiryYear as creditCa9_477_ 
          from
              Booking booking0_ 
          where
              booking0_.user_username=? 
          order by
              booking0_.checkinDate
      2008-12-12 13:57:08,485 DEBUG [org.jboss.seam.transaction.EntityTransaction] committing JPA resource-local transaction
      2008-12-12 13:57:08,487 DEBUG [org.jboss.seam.contexts.FacesLifecycle] After render response, destroying contexts
      2008-12-12 13:57:08,489 DEBUG [org.jboss.seam.contexts.FacesLifecycle] <<< End JSF request for /jboss-seam-jpa/confirm.seam
      



      Notice that the INSERT statement for a new Booking appears after the transaction commit. If I were using Hypersonic, the insert would be logged before the commit. Does anyone know the reason for this? Does that mean the insert is being executed outside of the Seam-managed transaction?


      Thanks in advance,
      Mathieu