从 cfquery 中删除事务
Removing Transactions from cfquery s
我有一些原始代码看起来像
<cftransaction>
<cfquery>
UPDATE
...
</cfquery>
<cfquery>
UPDATE
...
</cfquery>
<cfquery>
DELETE
...
</cfquery>
</cftransaction>
我希望将代码更改为
<cftransaction>
<cfscript>
QueryExecute("
UPDATE
...
UPDATE
...
DELETE
...
");
</cfscript>
<cftransaction>
我还需要使用 <cftransaction>
吗?
是的。
SQL 服务器默认为 auto-commit 模式。如果没有显式事务,每个单独的语句将在执行后提交。就像您在 SSMS 中执行 SQL 字符串一样。
这里有一个例子来演示。它连续执行三个 UPDATE 语句(故意在第二个上造成错误)。没有事务,第一个和最后一个 UPDATE 成功,但中间的一个被回滚。因此,如果所有三个语句都应作为一个单元处理,则必须使用 cftransaction。
之前:
之后:
DDL/Sample数据:
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>
我有一些原始代码看起来像
<cftransaction>
<cfquery>
UPDATE
...
</cfquery>
<cfquery>
UPDATE
...
</cfquery>
<cfquery>
DELETE
...
</cfquery>
</cftransaction>
我希望将代码更改为
<cftransaction>
<cfscript>
QueryExecute("
UPDATE
...
UPDATE
...
DELETE
...
");
</cfscript>
<cftransaction>
我还需要使用 <cftransaction>
吗?
是的。
SQL 服务器默认为 auto-commit 模式。如果没有显式事务,每个单独的语句将在执行后提交。就像您在 SSMS 中执行 SQL 字符串一样。
这里有一个例子来演示。它连续执行三个 UPDATE 语句(故意在第二个上造成错误)。没有事务,第一个和最后一个 UPDATE 成功,但中间的一个被回滚。因此,如果所有三个语句都应作为一个单元处理,则必须使用 cftransaction。
之前:
之后:
DDL/Sample数据:
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>