事务、存储过程和 PDO

Posted

技术标签:

【中文标题】事务、存储过程和 PDO【英文标题】:Transaction, stored procedure and PDO 【发布时间】:2012-09-26 13:29:42 【问题描述】:

php 中的单个操作必须经过以下步骤:

    执行编号。来自 PHP PDO 的 mysql 语句,基于大量业务逻辑。 执行存储过程。 从 PDO 执行更多 MySQL 语句。

整个过程需要是一个单一的交易。如果 MySQL 存储过程发生任何错误,则必须回滚整个事务。 (存储过程具有创建临时表、执行基于游标的扫描和执行插入的查询。)即使在存储过程之后的 PDO 中发生错误,事务也必须完全回滚,包括在存储过程。

基于 PDO 的查询在很久以前就被编程了。存储过程是根据客户的新需求而新推出的。

在 PHP 中,Transaction 在 Step 1 开始时启动。Step 3 结束时有一个 commit。最后有一个 catch 块,导致回滚。

应该在存储过程中启动事务吗?如果是这样,如何在错误时完全回滚?还是我们应该在存储过程中手动将 auto-commit 设置为 false?或者,有没有其他方法可以通知 MySQL 这个存储过程已经是事务的一部分。

如果不是,是否保证整个动作的原子性?

【问题讨论】:

存储过程将成为您通过 PDO 启动的事务的一部分。当然,您必须使用支持事务的存储引擎。 有趣的问题。我不认为 PDO 本身就支持嵌套事务。你可能会使用savepoints @N.B.:我刚刚尝试在存储过程中引入错误。并且动作没有回滚。事实上,直到错误点的所有更改都已提交(包括在调用存储过程之前发生的更改)。存储引擎是 InnoDB。 我打赌 PDO 数据库句柄和 SP 中的隐含句柄是不同的。交易不会在他们之间共享。不过,我找不到任何表明这一点的具体陈述。 @N.B.:刚刚发现提交是由于我的存储过程中的编码错误引起的。在创建临时表之前,我发出了一个Drop Table 语句,没有“临时”关键字,这会导致自动提交。正如您所提到的,存储过程似乎是事务的一部分。为了完成并帮助像我这样困惑的编码人员,这是来自 MySQL 文档的注释 在所有存储的程序中,解析器将 BEGIN 视为 BEGIN ... END 块的开头。在此上下文中使用 START TRANSACTION 开始事务 【参考方案1】:

这是 mohip 报价的链接:http://dev.mysql.com/doc/refman/5.6/en/begin-end.html 事务不是在存储过程中自动运行的,需要通过“START TRANSACTION”触发,我正要问这个问题。感谢您的报价。

【讨论】:

以上是关于事务、存储过程和 PDO的主要内容,如果未能解决你的问题,请参考以下文章

PHP MySQL PDO 存储过程和 INOUT 参数

PDO 和 MySQL 存储过程。不返回参数

mysql PDO和存储过程动态SQL注入

PDO 存储过程调用

在 PHP 中使用 PDO 创建存储过程

使用 PDO 调用带有 Out 参数的存储过程