帮我找出僵局

| 这是我第一次自己看到此代码时遇到僵局。
Caused by: java.sql.BatchUpdateException: Lock wait timeout exceeded; try restarting transaction
下面是代码:(Java /伪代码)
// This function inside a Job implementation of Quartz Job
execute(...)
{
     UserTransaction trans = getTransaction();
     trans.begin();

     Session session = getSession();

     List<PersistedObject> list = getListOfPersistedObjects(...)

     int counter = 0;
     loop(l : list)
     {
           counter++;

          // this is just sending a message using information based on the object
           sendMessage(l); 

           // Create a 2nd \"archive\" object based on the data inside the l object
           PersistedObjectArchive archive = new PersistedObjectArchive(l)

           session.save(archive);
           session.flush();

           session.delete(l);
           session.flush();

           if(counter % JDBC_BATCH_SIZE_CONSTANT_FROM_SOMEWHERE == 0)
           {
                session.flush(); // Deadlock Exception happens here
                session.clear();
           }
     }

     trans.commit();
}
我认为上面的代码可以清除一些-我看不到使用这么多的刷新,但是我现在只是使用现有的代码。 有人注意到造成死锁的原因是什么?     
已邀请:
这不是数据库中的死锁,它是等待另一个数据库会话持有的锁时的超时。您应该在Hibernate中打开SQL日志记录,并在抛出异常之前立即查看应用程序在做什么。您还可以使用Oracle的动态性能视图从数据库中获取更多信息。例如,从V $ LOCK中选择以查找当前持有的锁。您可能需要将其加入V $ SESSION,以了解有关锁持有人的更多信息。     
由于异常,我认为问题不在此代码中,我认为这是数据库超时。 顺便说一句:您应该重新考虑处理交易的方式。我认为2英镑在某些情况下可能会有所帮助。     

要回复问题请先登录注册