首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从cfquery中删除事务

从cfquery中删除事务
EN

Stack Overflow用户
提问于 2019-09-19 16:44:32
回答 1查看 118关注 0票数 2

我有一些原始代码看起来

代码语言:javascript
复制
<cftransaction>
   <cfquery>
   UPDATE
   ...
   </cfquery>
   <cfquery>
   UPDATE
   ...
   </cfquery>
   <cfquery>
   DELETE
   ...
   </cfquery>
</cftransaction>

我希望将代码更改为

代码语言:javascript
复制
<cftransaction>
<cfscript>
QueryExecute("
 UPDATE
 ...

 UPDATE
 ...

 DELETE
 ... 
 ");

</cfscript>
<cftransaction>

我还需要使用<cftransaction>吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-19 18:23:56

是。

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

下面是一个要演示的例子。它在一行中执行三个UPDATE语句(故意导致第二个UPDATE语句出现错误)。如果没有事务,第一次也是最后一次更新将成功,但中间的更新将被回滚。因此,如果所有三个语句都应该作为一个单元处理,则必须使用cftransaction。

以前:

后:

DDL/示例数据:

代码语言:javascript
复制
CREATE TABLE SomeTable ( Id INT, Col VARCHAR(50) )

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

CF

代码语言:javascript
复制
<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> 
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58015572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档