Deadlock unmanaged
loic Aug 29, 2008 6:54 AMI'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