从cfquery中删除事务

问题描述 投票:2回答:1

我有一些原始代码,看起来像

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

我希望将代码更改为

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

 UPDATE
 ...

 DELETE
 ... 
 ");

</cfscript>
<cftransaction>

我仍然需要使用<cftransaction>吗?

tsql coldfusion cfml cfquery coldfusion-2018
1个回答
4
投票

是。

SQL Server默认为auto-commit模式。没有显式事务,每个单独的语句将在执行后提交。就像您在SSMS中执行SQL字符串一样。

这是一个示例进行演示。它连续执行三个UPDATE语句(故意在第二个语句上导致错误)。如果没有事务,则第一个和最后一个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> 
© www.soinside.com 2019 - 2024. All rights reserved.