Лучшие практики для транзакций базы данных уровня приложений - PullRequest
3 голосов
/ 23 декабря 2009

Я видел несколько различных cftransaction примеров и читал разные сайты, но до сих пор не смог найти однозначного ответа на вопрос, какие части cftransaction необходимы. То, что я пытаюсь сделать, очень просто:

  • начать транзакцию
  • запускать несколько вставок / обновлений
  • закрыть сделку

Если во время вставки / обновления возникнет ошибка, я хочу откатить транзакцию. Вот что я сделал в прошлом:

<cftransaction>
 <cftry>
  <!--- multiple insert/update queries --->
 <cfcatch type="any">
  <cftransaction action="rollback">
  <!--- log error, show user message --->
 </cfcatch>
 </cftry>
<cftransaction action="commit">
</cftransaction>

Это правильно? Какова лучшая практика? Не все экземпляры cftransaction соответствуют приведенному выше примеру. У некоторых есть только начальный и конечный теги.

Я видел некоторые проблемы с моим сервером базы данных и думаю, что неправильное использование транзакций может быть одной из проблем. Я вижу большое количество: set transaction isolation level read committed процессов в мониторе активности, которые занимают большое количество ЦП.

Ответы [ 3 ]

1 голос
/ 23 декабря 2009

Пока вы это делаете, строки "commit" и "rollback" избыточны. Они действительно полезны только в том случае, если вы хотите, чтобы некоторые запросы были зафиксированы, а другие откатаны. Поскольку вы делаете все или ничего, вам действительно они не нужны.

Я обычно так делаю:

<cftry>
  <cftransaction>
    <!--- multiple insert/update queries --->
  </cftransaction>
  <cfcatch type="database">
    <!--- log error, show user message --->
  </cfcatch>
</cftry>
0 голосов
/ 18 сентября 2011

Кажется, что вы можете сделать намного проще, чем в ColdFusion 9:

<cfscript>
  transaction {
    // ... your DB code
  }
</cfscript>

У меня есть все остальное в моем приложении в работе, и оно работает как положено: изменения фиксируются в конце блока транзакции (если он не вложен), и любые исключения вызывают откат.

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

0 голосов
/ 23 декабря 2009

Две ноты:

Я думаю, вы хотите поместить блок cftry вокруг транзакции cftry. В противном случае он откатит транзакцию и попытается ее зафиксировать.

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

...