【问题标题】:cfml transaction commit rollback different transactioncfml 事务提交回滚不同的事务
【发布时间】: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


【解决方案1】:

没有。提交事务是最终的。无法回滚。

请记住,CF 的唯一作用是将 sql 命令转发到您的 dbms。数据库完成其余的工作。因此,如果您对特定 sql 操作的行为有疑问,您应该查阅您的数据库文档。例如:

【讨论】:

  • 非常感谢您的回答。已经开始认为交易是最终的,经过大量测试我确实发现一旦交易完成,它就完成了..
猜你喜欢
  • 2013-11-20
  • 1970-01-01
  • 2012-12-24
  • 2013-11-22
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多