[jboss-user] [Persistence, JBoss/CMP, Hibernate, Database] - Deadlock unmanaged

loic do-not-reply at jboss.com
Fri Aug 29 06:54:34 EDT 2008


I'm using SEAM with Ejb3 on jboss-4.0.5.GA, with SQL server 2000, driver jtds.
On one of my server i got sometimes deadlock errors :


2008-08-28 17:51:03,381 WARN  [org.hibernate.util.JDBCExceptionReporter] SQL Error: 1205, SQLState: 40001
  | 2008-08-28 17:51:03,381 ERROR [org.hibernate.util.JDBCExceptionReporter] Transaction (Process ID 53) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
  | 2008-08-28 17:51:03,381 INFO  [STDOUT] Exception during cancel org.hibernate.exception.LockAcquisitionException: could not execute query
  | 2008-08-28 17:51:03,381 ERROR [STDERR] javax.persistence.PersistenceException: org.hibernate.exception.LockAcquisitionException: could not execute query
  | 2008-08-28 17:51:03,381 ERROR [STDERR] 	at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:647)
  | 2008-08-28 17:51:03,381 ERROR [STDERR] 	at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:73)
  | 2008-08-28 17:51:03,381 ERROR [STDERR] 	at com.edieyes.optixml.ejb3.sessions.StockBean.cancel(StockBean.java:162)
  | 


The most important matter is that after it (even if i catch the Exception) my next query are all failed.

Here is  my part of code failing (on about 1% of time) :

  | @Stateless
  | public class StockBean implements RemoteStock{
  | @PersistenceContext(unitName = "stocktest")
  | 	protected EntityManager em;
  | 
  | 
  | 	public void cancel(String orderNumber, String jobNumber) {
  | 		// TODO Auto-generated method stub
  | 		try{
  | 			String query="SELECT c FROM StockReserved as c where c.orderNumber=?1  and c.jobNumber=?2";
  | 			Query q = em.createQuery(query).setParameter(1, orderNumber).setParameter(2,jobNumber);
  | 			
  | 			Iterator iterator =q.getResultList().iterator();
  | 			while(iterator.hasNext()){
  | 				StockReserved stockReserved=(StockReserved) iterator.next();
  | 				String oldCodeArticle=stockReserved.getCodeArticle();
  | 				int oldQuantite=stockReserved.getQuantite();
  | 				int status=stockReserved.getStatus();
  | 				Stock stock=(Stock) em.createQuery("SELECT c FROM Stock c where codeArticle = ?1").setParameter(1,oldCodeArticle).getSingleResult();
  | 				if(status==0)stock.setStockPreReserved(stock.getStockPreReserved()-oldQuantite);	
  | 				else if(status==1)stock.setStockReserved(stock.getStockReserved()-oldQuantite);	
  | 				
  | 			}
  | 			
  | 			
  | 			query="delete FROM StockReserved as c where c.orderNumber=?1 and c.jobNumber=?2";
  | 			q = em.createQuery(query).setParameter(1, orderNumber).setParameter(2,jobNumber);
  | 			int deleted = q.executeUpdate();
  | 			System.out.println(deleted+" JOBS DELETED ");
  | 
  | 		/////*****IT FAILS HERE	
  | 
  | 				updateJobNumbers(orderNumber,jobNumber);
  | 			
  | 			
  | 		}catch(Exception e){
  | 			
  | 			System.out.println("Exception during cancel "+e.getMessage());
  | 			
  | 			
  | 			e.printStackTrace();
  | 		}
  | 	}
  | 	
  | }
  | 
  | 



It's Called like that 



  | stockService.cancel("000021","001");	
  | 


The best should be not to have anymore this error... but all the tried I did failed.. so if you have a solution?

Else I would like to have a way to go threw that and that the next query won't fail, because for now i have this Exception :


 javax.persistence.TransactionRequiredException: EntityManager must be access within a transaction
  | 2008-08-27 14:52:16,488 ERROR [STDERR] javax.ejb.EJBTransactionRolledbackException: javax.persistence.TransactionRequiredException: EntityManager must be access within a transaction
  | 2008-08-27 14:52:16,488 ERROR [STDERR] 	at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:93)
  | 
or this one

  | 2008-08-28 17:51:03,490 WARN  [org.hibernate.util.JDBCExceptionReporter] SQL Error: 0, SQLState: null
  | 2008-08-28 17:51:03,490 ERROR [org.hibernate.util.JDBCExceptionReporter] Transaction is not active: tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=SVR-EDIEYES/553168, BranchQual=, localId=553168]; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=SVR-EDIEYES/553168, BranchQual=, localId=553168])
  | 2008-08-28 17:51:03,490 INFO  [STDOUT] getSupplementsGridsPriceByFabArea org.hibernate.exception.GenericJDBCException: Cannot open connection
  | 


THANKS FOR YOUR HELP

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

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



More information about the jboss-user mailing list