在存储过程之外提交事务


Committing transaction outside of stored procedure

执行 1 个或多个存储过程时,是否可以在过程周围而不是内部放置事务?

$db->beginTransaction();
$db->exec("call my_procedure()");
$db->exec("call my_second_procedure()");
$db->commit();

当执行上述操作(pdo)时,事务是在两次调用后提交,还是在每次调用运行后自动提交,使beginTransaction()commit()无用?

是的,你可以。

只要没有任何过程在内部执行COMMITROLLBACKSTART TRANSACTION,并且只要没有任何过程(或代码)执行任何导致隐式提交的语句,就可以正常工作。

当您正在运行事务时,自动提交不会生效,即使SELECT @@autocommit;仍会指示"1",这仅指示当事务未处于活动状态时,会话处于自动提交模式。

我会说,"这取决于" :-)

首先,如果你使用的是不支持事务的MyISAM,PDO::beginTransaction()仍然返回true,但没有启动事务。

请参阅 http://php.net/manual/en/pdo.transactions.php