我有一些原始代码看起来
<cftransaction>
<cfquery>
UPDATE
...
</cfquery>
<cfquery>
UPDATE
...
</cfquery>
<cfquery>
DELETE
...
</cfquery>
</cftransaction>我希望将代码更改为
<cftransaction>
<cfscript>
QueryExecute("
UPDATE
...
UPDATE
...
DELETE
...
");
</cfscript>
<cftransaction>我还需要使用<cftransaction>吗?
发布于 2019-09-19 18:23:56
是。
Server默认为自动提交模式。如果没有显式事务,每个单独的语句都将在执行后提交。就像在SSMS中执行SQL字符串一样。
下面是一个要演示的例子。它在一行中执行三个UPDATE语句(故意导致第二个UPDATE语句出现错误)。如果没有事务,第一次也是最后一次更新将成功,但中间的更新将被回滚。因此,如果所有三个语句都应该作为一个单元处理,则必须使用cftransaction。
以前:

后:

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> https://stackoverflow.com/questions/58015572
复制相似问题