проверить мое понимание о блокировках и потоках БД - PullRequest
0 голосов
/ 01 февраля 2012

Я наблюдал следующие журналы ошибок в одном из файлов журналов

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 не будет освобожден, что приведет к тупиковый. В конечном счете, эта внутренняя транзакция получает исключение по тайм-ауту для выхода из этого тупика.

Допустимо ли мое утверждение?

Это можно решить, если я начну новую / внутреннюю транзакцию в другом потоке?

Надеюсь, вы понимаете это, потому что я не умею это объяснять!

1 Ответ

2 голосов
/ 01 февраля 2012

"Это можно решить, если я начну новую / внутреннюю транзакцию в другом потоке?"

  • номер

Если это правда:

У меня есть класс, начинающий транзакцию, в которой он получает таблицу LOCK, в тот же блок кода, в соответствии с требованием, нам нужно начать новый транзакция, которая собирается получить LOCK для той же таблицы, кажется

тогда у вас, кажется, есть фундаментальный недостаток дизайна.

Вы должны либо удерживать менее строгий уровень изоляции транзакции, либо изменить свою логику (или, возможно, обе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...