[jboss-user] [Persistence, JBoss/CMP, Hibernate, Database] - entitymanager cache corrupted on rollback

deanhiller do-not-reply at jboss.com
Fri May 1 10:31:45 EDT 2009


I was hoping I could use a long running "user/application" transaction or what is sometimes called conversation in a certain scenario like so....

1. begin conversation
2. tx 1....load list of stuff I need to process
3. tx 2...process first item in list
4. tx 3...process second item in list
5. tx 4...process third item in list
6. etc. etc. etc.

If 4 fails and gets rolled back, I want 5 to still go.  I would almost expect the entire cache at step 4 to be flushed so my changes would not be persisted.  It seems though with hibernate that step 5 is dead because step 4 failed....Here is my test code below.....


  | 		EntityManagerFactory sf = Persistence.createEntityManagerFactory(
  | 				"xcoreNonJta", null);
  | 		
  | 		EntityManager mgr = sf.createEntityManager();
  | 		org.hibernate.Session session = (org.hibernate.Session) mgr.getDelegate();
  |         session.setFlushMode(org.hibernate.FlushMode.MANUAL);
  |         
  |         //verify we are in flush manual mode first by NOT flushing!!
  |         mgr.getTransaction().begin();
  | 		Users user = Users.getUserById(mgr, "admin");
  |         user.setCountry("USACCCCC");
  |         mgr.getTransaction().commit();
  |         
  |         
  | 		mgr.getTransaction().begin();
  | 		
  | 
  | 		user.setAddress1("addr1CCCCC");  //written to db 3 lines later during commit!!!
  | 		mgr.flush(); //NOTE: whatever changes are above flush are persisted at commit time
  | 		user.setAddress2("addr2CCCCC");  //not written to db at all due to rollback and after flush
  | 		mgr.getTransaction().commit();
  | 		
  | 		mgr.getTransaction().begin();
  | 		
  | 		user.setCity("city1"); //not written to db because of the rollback even though flush is called
  | 
  | 		mgr.flush();
  | 		mgr.getTransaction().rollback();
  | 		
  | 		mgr.getTransaction().begin();
  | 		
  | 		user.setAddress1("addr1DDDDD"); //not written to db, the cache appears to be forever dead!!!
  | 		mgr.flush();
  | 		user.setAddress2("addr2DDDDD");
  | 		mgr.getTransaction().commit();
  | 		
  | 		mgr.close();
  | 		sf.close();
  | 

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

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



More information about the jboss-user mailing list