【发布时间】:2015-03-10 13:04:12
【问题描述】:
是否可以有一个事务,提交该事务,有一个新事务,当第二个事务出现错误时,是否可以回滚两个事务?
见下文:
transaction action="begin" {
transaction action="SetSavepoint" savepoint="sp1";
try {
.. do something ...
transactionCommit();
}
catch (any, e) {
transactionRollback("sp1");
}
}
transaction action="begin" {
transaction action="SetSavepoint" savepoint="sp2";
try {
.. do something ...
transactionCommit();
}
catch (any, e) {
transactionRollback("sp1");
transactionRollback("sp2");
}
}
【问题讨论】:
-
不确定 CFML 是如何工作的,但您一次只能打开一个事务。我怀疑一旦
transaction action="begin"块结束,事务就会提交。 -
@ColonelThirtyTwo - FWIW,CFML 只是将 sql 命令转发到数据库执行。因此,行为与您直接在数据库中发出相同的命令相同,即
begin transaction, rollback, commit,....。 -
我发现 cftransaction 是有风险的,我曾遇到过 cfml 服务器重启/超时会使打开的事务处于打开状态的情况。 cfcatch 块在这些情况下无济于事。我们现在要么将我们的 SQL 放入存储过程中。或者直接使用
写出事务命令并使用本机事务命令。这样,提交、回滚等代码就被批量发送到 SQL Server,确保没有挂起的事务。例如,当使用 MS-SQL Server 时,您可以这样设置保存点。
标签: transactions rollback cfml