Oracle ALTER SESSION для формата даты и опции сортировки, обязательный коммит? - PullRequest
1 голос
/ 09 октября 2019

Недавно я был назначен на унаследованный проект, в котором в качестве базы данных используется Oracle, а в качестве уровня службы - phpСуществует класс DB.php, который обрабатывает выполнение базы данных. Он содержит функцию connect (), которая подключается к базе данных. Внутри этого соединения, кроме порождения нового соединения, он также вызывает две дополнительные функции, которые выполняют что-то вроде -

ALTER SESSION SET NLS_DATE_FORMAT = <something>
ALTER SESSION SET NLS_SORT = <something>

Проблема в том, что эти две функции явно фиксируют транзакции в БД сразу после ALTERingСЕССИЯ. Это имеет побочный эффект, при котором любая транзакция до подключения также будет зафиксирована.

Обычно мы не фиксируем запросы sql до конца запроса, после проверки правильности всех проверок.

Кроме того, в любом стеке вызовов есть несколько мест, где DB.phpсоздается экземпляр и вызывается connect. В php, при вызове oci_connect с теми же параметрами, он вернет то же соединение, если оно уже существует. Поэтому в некоторых случаях эта функция подключения выполняет транзакции, которые не должны быть зафиксированы.

Я пытался обойти эту проблему, но мои обходные пути являются избыточным решением проблемы. Мой вопрос на самом деле таков: Нужно ли делать коммит после ИЗМЕНЕНИЯ СЕССИЙ в php-> oracle?

Потратил очень много времени, исправляя его другими способами иКроме того, я попытался найти это в Интернете и не нашел ответа, где этот сценарий commit принимается во внимание. Любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 09 октября 2019

ALTER SESSION ... не фиксирует вашу текущую транзакцию неявно. COMMIT не требуется, чтобы сделать его эффективным.

Только при запуске ALTER SESSION ENABLE PARALLEL ... незафиксированные транзакции должны быть либо зафиксированы, либо откатаны до выполнения этого условия для DML.

Единственный способЧтобы избежать этой проблемы, необходимо выполнить команду ALTER SESSION сразу после открытия соединения с базой данных, т. е. перед выполнением любых операторов DML. В любом случае, это будет наиболее полезная опция.

Или вы должны использовать явные NLS_DATE_FORMAT в TO_CHAR() вызовах. Для заказа вы должны будете использовать ORDER BY NLS_SORT(..., 'NLS_SORT=...') (спасибо Radagast81)

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