[jboss-user] [JBoss Seam] - Transaction demarcation problem

dreuzel do-not-reply at jboss.com
Tue Jan 22 08:59:12 EST 2008


i need to update thousands of independent records in sheduled environment. 

For efficiency reasons I need to do that in a big loop ( set of loops) 
also because the underlying info is externaly organised like that. 

I disabled  the  seam control over  transactions 
I'm trying to disable  container management over transactions 

but so far I realy  can not Use transaction control in the environment
there is always something  wrong !!
If not seen any effect  of a flush  and  I'm losing all the work done 
due to the fact I need to rollback a single item transaction

 process 

  |   
  |  Connect  external 
  |  loop 
  |     update record 
  |     if (fails) 
  |        Rollback this ONLY RECORD WITHOUT ANY IMPACT 
  |        ON THE REST OF THE ENVIRONMENT 
  |  handle  next 
  | 
  


It is very important the overall process is not aborted on any individual error. 
(this is what is happening in the actual case with a fail rate on 1 on 1000 this means 
I never get never nothingthing done !!!!) 

at this time I use following code to handle the transaction 

as I'm working in a seam environment 
I switched to manual transaction handling 
and I'm bouncing/fighting against JTA CONTAINER - BEAN managed transactions 

code :


  | 
  | @Name("loopscan") 
  | @TransactionManagement(TransactionManagementType.BEAN)         //kill container management 
  | @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)  //suspend  all active  container transactions 
  | public class BatchTransactions 
  | { 
  | //    @Logger 
  |    private Log log; 
  | //    @In ("#{entityManager}") 
  |    public        EntityManager em;//allow for  db ACCESS    
  |    Session ses=null;//session indicator 
  |    String env="Init"; 
  |  //   org.hibernate.Transaction txn=null;//hibernate transaction 
  | public BatchTransactions() {} 
  | public void initTransaction() 
  | { 
  | } 
  | public Exception sequence() 
  | { 
  |     Exception errcod=null; 
  |     org.hibernate.Transaction txn=null;// 
  |     boolean   rollback=false; 
  |     //reset  timeout 
  |     try { env="Timeout"; 
  |           org.jboss.seam.transaction.Transaction.instance().setTransactionTimeout(60*60*10000000); 
  |         } catch (Exception er) 
  |                            {errcod=er; 
  |                             String errmsg=er.getClass().getSimpleName() +" err: "+ er.getMessage(); 
  |                             log.error(env+" Modifying timeout failed "+ errmsg); 
  |                            } 
  |    // seam timeout     
  |     try { env ="seam timeout";               
  |         Transaction.instance().setTransactionTimeout(60*60*10000000);} catch (Exception er) 
  |           {errcod=er; 
  |            String errmsg=er.getClass().getSimpleName() +" err: "+ er.getMessage(); 
  |              log.error(env+" Modifying Seam  timeout failed "+ errmsg); 
  |              } 
  |     // 
  |     //connect to session 
  |     // 
  |         env="setup"; 
  |         ses=(Session) em.getDelegate();//get  the session 
  | 
  |     // 
  |     //   transaction with own error handling 
  |     // 
  |     try { env="Begin";// Begin the transaction ?           
  |          txn=ses.getTransaction(); 
  |          if(!txn.isActive()) 
  |                                 txn.begin();//       txn=ses.beginTransaction(); ********************** 
  |                                 // txn.setTimeout(500000); 
  |         } catch (Exception er ) 
  |                      {errcod=er; 
  |                         String errmsg=er.getClass().getSimpleName() +" err: "+ er.getMessage(); 
  |                         log.error(env+" starting transaction failed "+ errmsg); 
  |                    } 
  |     try {env="execute ";  //ececution process 
  |         errcod=Execute();//do the  DB operations 
  |        try {//flush the  info to other users 
  |                ses.flush(); 
  |               } catch (Exception er ) 
  |                                {errcod=er;rollback=true; 
  |                                  String errmsg=er.getClass().getSimpleName() +" err: "+ er.getMessage(); 
  |                                  log.error("Flush "+env+" Commiting transaction failed "+ errmsg); 
  |                                 } 
  | 
  |        try {//commit the information 
  |            txn.commit(); 
  |           } catch (Exception er ) 
  |                                 {errcod=er;rollback=true; 
  |                                   String errmsg=er.getClass().getSimpleName() +" err: "+ er.getMessage(); 
  |                                   if (errmsg.indexOf("NullPointerException")>-1) 
  |                                      log.error("Commit "+env+" Commit nullpointer exception failed "+ errmsg,er); 
  |                                    else log.error(env+" Commiting transaction failed "+ errmsg); 
  |                                  } 
  |         
  |      } catch( GenericJDBCException er) 
  |                {String errmsg=er.getClass().getSimpleName() +" err: "+ er.getMessage();rollback=true; 
  |  //               if (errmsg.indexOf("Cannot open connection")>-1) 
  |  //                     {   if  (!em.isOpen()) log.info("Em session still open !"); 
  |  //                        try {if (ses==null) {ses=(Session) em.getDelegate();}//get  the session 
  |  //                                txn=ses.beginTransaction();      
  |               log.error(env+" Cannot open connection "+ errmsg,er); 
  |                } 
  |        catch (Exception er) {FatalStatus();errcod=er;rollback=true; 
  |                             String errmsg=er.getClass().getSimpleName() +" err: "+ er.getMessage(); 
  |                              if (errmsg.indexOf("NullPointerException")>-1) 
  |                                              log.error(env+" nullpointer exception failed "+ errmsg,er); 
  |                                 else log.error(env+" overall transaction error "+ errmsg); 
  |                           } 
  |           if (rollback) 
  |               try {//rollback cover 
  |                   txn.rollback(); 
  |                   } catch (Exception er) 
  |                                        {errcod=er; 
  |                                         String errmsg=er.getClass().getSimpleName() +" err: "+ er.getMessage(); 
  |                                         log.error("Rollback "+env+" Rollback transaction failed "+ errmsg +" From "+ errmsg); 
  |                                        } 
  |           // 
  |           //   detect losing the session 
  |           // 
  |         if (ses==null) 
  |         { if (!(em.isOpen()))  log.info("em session closed !"); 
  |         } 
  |    return errcod; 
  |     
  | } 
  | /* 
  | */ 
  | public void      TxnSts(String env)  {this.env=env;} 
  | public Exception Execute() throws Exception  {return null;}; 
  | public void      FatalStatus() {}; 
  | } 
  | { 
  | 
As you can see most of the code is error trapping and reporting 

It fails at the BEGIN transaction 
stating : TransactionException err: Could not register synchronization for container transaction 

The default for the bean is set to BEAN transactions 
but still it considers it a Container transaction 


any suggestions would be more then welcome


View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4122202#4122202

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4122202



More information about the jboss-user mailing list