Где я должен фиксировать транзакцию — в Хранимой процедуре или в коде вызывающего приложения?

Я использую PHP + Oracle и задавался вопросом, существуют ли какие-либо рекомендации на том, где фиксировать мои транзакции. Я называю хранимые процедуры, чтобы сделать все, что мой вставляет/обновляет/удаляет и в настоящее время фиксирует в конце моих хранимых процедур.

Я задавался вопросом:

  1. Есть ли любое различие между вызовом фиксации/отката в моей хранимой процедуре по сравнению с вызовом oci_commit / oci_rollback в моем коде PHP на основе успеха вызова хранимой процедуры.

  2. Который предпочтителен? Первоначально я думал в самих хранимых процедурах, но теперь я задаюсь вопросом, если бы нет никакого различия, возможно, это дало бы мне больше гибкости для фиксации в коде вызывающего приложения, так как я мог назвать несколько хранимых процедур в единственной транзакции вместо того, чтобы иметь необходимость записать новым хранимым процедурам каждый раз, когда я хочу смешивать/соответствовать множество SQL-операторов в единственной транзакции.

Мысли?

5
задан aw crud 29 January 2010 в 14:45
поделиться

3 ответа

Я определенно согласен с вариантом 2 по причинам, по которым вы даете. Наличие каждой хранимой процедуры действует как отдельная транзакция, иногда может быть слишком ограничивающей. Том Киты вернутся на опцию 2, а также это нить , например, .

7
ответ дан 18 December 2019 в 13:14
поделиться

Не уверен в PHP / Oracle, но наш SQL ProChs проверьте, если они уже будут в транзакции. Если они, они просто делают то, что они делают. Если нет, они создают транзакцию и сами совершают / откатываться. Это дает нам гибкость, особенно для процессов, которые называются несколькими различными процессами.

3
ответ дан 18 December 2019 в 13:14
поделиться

Вариант 2 - это путь, как правило. Если у вас есть коммиты внутри хранимых процедур, вы принимаете решение, что независимо от того, кто мне звонит, я знаю лучше и должен совершать любые открытые транзакции, когда я закончу свою работу.

Скажем, у вас есть какой-то процесс, состоящий из нескольких этапов, и вам нужно либо зафиксировать их все, либо откатить их все обратно. Если этот процесс случайно вызовет одну из ваших хранимых процедур, в которой есть коммит, в рамках выполнения своей работы, то все до этого момента может быть коммитировано этой хранимой процедурой.

Почти всегда предпочтительнее позволить вызывающему абоненту решить, что должно произойти с транзакцией. Одним из обычных исключений является автономная транзакция внутри процедуры для случаев, которые в ней конкретно нуждаются.

4
ответ дан 18 December 2019 в 13:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: