Удаление транзакций из cfquery s - PullRequest
2 голосов
/ 19 сентября 2019

У меня был какой-то оригинальный код, который выглядел как

<cftransaction>
   <cfquery>
   UPDATE
   ...
   </cfquery>
   <cfquery>
   UPDATE
   ...
   </cfquery>
   <cfquery>
   DELETE
   ...
   </cfquery>
</cftransaction>

Я хочу изменить код на

<cftransaction>
<cfscript>
QueryExecute("
 UPDATE
 ...

 UPDATE
 ...

 DELETE
 ... 
 ");

</cfscript>
<cftransaction>

Мне все еще нужно использовать <cftransaction>?

1 Ответ

4 голосов
/ 19 сентября 2019

Да.

Для SQL Server по умолчанию используется режим auto-commit .Без явной транзакции каждый отдельный оператор будет зафиксирован после его выполнения.Точно так же, как если бы вы выполняли строку SQL в SSMS.

Вот пример для демонстрации.Он выполняет три оператора UPDATE подряд (намеренно вызывая ошибку для второго).Без транзакции первое и последнее ОБНОВЛЕНИЕ завершаются успешно, но средняя откатывается.Таким образом, если все три оператора должны обрабатываться как единое целое, вы должны использовать cftransaction.

До:

Image of data before queries

После:

Image of data after queries, without a transaction

DDL / данные выборки:

CREATE TABLE SomeTable ( Id INT, Col VARCHAR(50) )

INSERT INTO SomeTable
VALUES (1,'Original'),(2,'Original'),(3,'Original')

CF

<cfscript>
   before = QueryExecute(" SELECT * FROM SomeTable");
   writeDump( before );

   // DEMO: Deliberately omits cftransaction and causes error
   try {
      QueryExecute(" UPDATE SomeTable SET Col = 'Changed' WHERE Id = 1
                     UPDATE SomeTable SET Col = 'Changed' WHERE Id = 2 AND Id = 1 / 0
                     UPDATE SomeTable SET Col = 'Changed' WHERE Id = 3
                 ");
   }
   catch( any e) {
      writeDump( e );
   }

   after = QueryExecute(" SELECT * FROM SomeTable");
   writeDump( after );
</cfscript> 
...