Где я должен совершить транзакцию - в хранимой процедуре или в коде вызывающего приложения? - PullRequest
5 голосов
/ 29 января 2010

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

Мне было интересно:

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

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

Мысли

Ответы [ 3 ]

7 голосов
/ 29 января 2010

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

4 голосов
/ 29 января 2010

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

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

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

3 голосов
/ 29 января 2010

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

...