這是我第一次看到這個代碼,我們正在陷入僵局。幫我找到死鎖
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();
}
我覺得上面的代碼可以被清理了一下 - 我沒有看到使用這麼多刷新的,但我只是現在使用現有的代碼。
任何人都可以注意到可能導致死鎖的原因?
沒有足夠的信息來找到死鎖....會話對象使用的所有函數裏面有什麼? – 2011-04-13 17:45:50
還有其他交易嗎? – axtavt 2011-04-13 17:48:23