【问题标题】:phpBB sql transaction function not workingphpBB sql事务功能不起作用
【发布时间】:2016-05-02 03:34:43
【问题描述】:

我正在使用 phpBB,但此代码未按预期工作。它只是使用 phpBB sql_transaction 函数启动一个 sql 事务,然后提交它。但是应该在中途抛出异常并使用相同的函数发出回滚。

但是,回滚永远不会发生。查询 1 和 2 生效,我无法让它们回滚。

documentation表示如果出现sql错误,它会自动发出回滚,但是如果出现php错误,例如超时什么的,我正在尝试回滚。

我正在使用 MySQL 5.7、phpBB 3.0.11 和 php 5.6。

有人能指出问题吗?

$db->sql_transaction('begin');

try {
    $sql = 'UPDATE aaa_temp SET method = "a" WHERE id = 1';
    $db->sql_query($sql);

    $sql = 'UPDATE aaa_temp SET method = "b" WHERE id = 2';
    $db->sql_query($sql);

    throw new Exception('OMG TOTAL ERROR');

    $sql = 'UPDATE aaa_temp SET method = "c" WHERE id = 3';
    $db->sql_query($sql);

} catch (Exception $ex) {
    $db->sql_transaction('rollback');
    trigger_error($ex->getMessage(), E_USER_ERROR);
}

$db->sql_transaction('commit');

提前致谢!我知道这一定是非常简单和愚蠢的事情,但如果需要更多细节,请告诉我。

编辑:很清楚,我说的是 MySQL 中的 SQL 事务。

【问题讨论】:

  • 你问为什么throw new Exception之前的两个UPDATE查询正在执行?
  • 我知道它们正在被执行,但它们应该是交易的一部分。当抛出异常并发出回滚时,为什么它们会成功?这两个更新不应该回滚吗?

标签: php mysql transactions phpbb sqltransaction


【解决方案1】:

事实证明,我试图回滚更新的表使用的是不支持事务的 MyISAM 存储引擎。

具有讽刺意味的是,这正是 phpBB 构建它们的具体方式。 sql_transaction('rollback') 返回 true,因为回滚确实有效,只是没有收到关于数据未回滚的 SQL 警告。

通过在 MySQL 中启用 general_query_log 以准确查看该函数在后台执行的操作来解决此问题:

SET AUTOCOMMIT=0;

UPDATE aaa_temp SET method = "a" WHERE id = 1;

UPDATE aaa_temp SET method = "b" WHERE id = 2;

ROLLBACK;

SET AUTOCOMMIT=1;

因此,由于我混合了 MyISAM 和 InnoDB 表,因此对后者的更改会被回滚,而对前者的更改则不会。

【讨论】:

    【解决方案2】:

    您对异常的工作方式有误解。如果您有一个try{...}catch(...){...} 块,并且在try{...} 部分内的某处引发了异常,那么这表明您的代码流将跳转到catch(...){...} 块的开头。

    在抛出异常之前发生的所有代码都会发生。只有在异常之后的 try 块内的代码不会发生。没有 rollback 发生消除以前完成的所有进程,因为这对于 php 开发人员来说非常(非常)困难。想象一下,如果您的 php 代码执行了诸如发送电子邮件之类的操作。当电子邮件已经发送时,您如何期望回滚发生?因此,不会发生回滚。

    【讨论】:

    • 对不起,我说的是 SQL 事务。 phpBB 有一个sql_transaction 函数,允许您与事务进行交互。尽管前两个更新语句已运行,但当我调用 $db->sql_transaction('rollback'); 时,mysql 应该回滚它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2018-06-19
    • 2018-10-07
    • 2013-05-04
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多