Я наблюдал следующие журналы ошибок в одном из файлов журналов
2012-01-31 10:52:46,424 IST WARN "SQL Error: 2049, SQLState: 42000"
2012-01-31 10:52:46,424 IST ERROR "ORA-02049: timeout: distributed ransaction waiting for lock"
2012-01-31 10:52:46,440 IST ERROR "Could not synchronize database state with session"
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
У меня есть класс, запускающий транзакцию, в которой он получает таблицу LOCK, в том же блоке кода, что и в соответствии с требованием, нам нужно запустить новую транзакцию, которая собирается получить LOCK для той же таблицы, как кажется. В этом случае существует вероятность тупиковой ситуации, которая будет прервана / устранена этим Transaction Timeout
исключением.
Код внутренней транзакции здесь:
private void createXYZ(final Object tabPortletObject){
try {
//get the template
TransactionTemplate transactionTemplate = getTransactionTemplate();
//create a new transaction template with propagation behavior as requires new
TransactionTemplate newTransactionTemplate = new TransactionTemplate();
newTransactionTemplate.setTransactionManager(transactionTemplate.getTransactionManager());
newTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
//start a new transaction and set the status in that new transaction
newTransactionTemplate.execute(new TransactionCallbackWithoutResult() {
public void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
getHibernateTemplate().save(tabPortletObject);
}
});
} catch (Exception e) {
logger.info("Exception occured while creating [Tab/Portlet] :" + tabPortletObject);
}
}
И у меня есть внешняя транзакция, которая будет запущена в фильтре сервлета.
Я предполагаю, что внутренняя транзакция ожидает блокировки, полученной внешней транзакцией, и внешняя транзакция ожидает завершения выполнения этого блока кода для фиксации транзакции, и в этом случае LOCK не будет освобожден, что приведет к тупиковый. В конечном счете, эта внутренняя транзакция получает исключение по тайм-ауту для выхода из этого тупика.
Допустимо ли мое утверждение?
Это можно решить, если я начну новую / внутреннюю транзакцию в другом потоке?
Надеюсь, вы понимаете это, потому что я не умею это объяснять!