Php 事务、存储过程和PDO

Php 事务、存储过程和PDO,php,mysql,stored-procedures,pdo,Php,Mysql,Stored Procedures,Pdo,PHP中的单个操作必须经过以下步骤: 基于大量业务逻辑,从PHPPDO执行大量mysql语句 执行一个存储过程 从PDO执行更多MySQL语句 整个流程需要是单个事务。如果MySQL存储过程中发生任何错误,则必须回滚整个事务。(存储过程具有创建临时表、执行基于光标的扫描和执行插入的查询。)即使在存储过程之后PDO中发生错误,也必须完全回滚事务,包括存储过程中发生的任何更改 基于PDO的查询在很久以前就已经编程好了。存储过程是根据客户机的新需求而新引入的 在PHP中,事务在步骤1开始时启动。在步骤

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

  • 基于大量业务逻辑,从PHPPDO执行大量mysql语句
  • 执行一个存储过程
  • 从PDO执行更多MySQL语句
  • 整个流程需要是单个事务。如果MySQL存储过程中发生任何错误,则必须回滚整个事务。(存储过程具有创建临时表、执行基于光标的扫描和执行插入的查询。)即使在存储过程之后PDO中发生错误,也必须完全回滚事务,包括存储过程中发生的任何更改

    基于PDO的查询在很久以前就已经编程好了。存储过程是根据客户机的新需求而新引入的

    在PHP中,事务在步骤1开始时启动。在步骤3的末尾有一个提交。在末端有一个catch块,它会导致回滚

    是否应在存储过程中启动事务?如果是这样,如何在发生错误时完全回滚?或者我们应该在存储过程中手动将自动提交设置为false?或者,是否有其他方法通知MySQL该存储过程已经是事务的一部分


    如果没有,是否保证整个行动的原子性?

    这是mohip引用的链接:
    事务不是在存储过程中自动运行的,需要通过“启动事务”触发它,我正要问这个问题。感谢您的报价。

    这是mohip报价的链接:
    事务不是在存储过程中自动运行的,需要通过“启动事务”触发它,我正要问这个问题。感谢您的报价。

    存储过程将是通过PDO启动的事务的一部分。当然,您必须使用支持事务的存储引擎。这是一个有趣的问题。我认为PDO本机不支持嵌套事务。您可能可以使用@N.B.:我刚刚尝试在存储过程中引入一个错误。而且行动没有倒退。事实上,到错误点为止的所有更改都已提交(包括在调用存储过程之前发生的更改)。存储引擎是InnoDB。我打赌PDO db句柄和SP中的隐含句柄是不同的。交易将不会在他们之间共享。但是,我找不到任何具体的语句来说明这一点。@N.B.:只是发现提交是由于我的存储过程中的编码错误引起的。在创建临时表之前,我发出了一个
    Drop Table
    语句,没有'temporary'关键字,这导致了自动提交。正如您所提到的,存储过程似乎是事务的一部分。为了完成和帮助像我这样困惑的程序员,这是MySQL文档中的一条注释,在解析器将BEGIN视为BEGIN的开始的所有存储程序中。。。端块。在此上下文中,使用START transaction instead启动事务存储过程将是通过PDO启动的事务的一部分。当然,您必须使用支持事务的存储引擎。这是一个有趣的问题。我认为PDO本机不支持嵌套事务。您可能可以使用@N.B.:我刚刚尝试在存储过程中引入一个错误。而且行动没有倒退。事实上,到错误点为止的所有更改都已提交(包括在调用存储过程之前发生的更改)。存储引擎是InnoDB。我打赌PDO db句柄和SP中的隐含句柄是不同的。交易将不会在他们之间共享。但是,我找不到任何具体的语句来说明这一点。@N.B.:只是发现提交是由于我的存储过程中的编码错误引起的。在创建临时表之前,我发出了一个
    Drop Table
    语句,没有'temporary'关键字,这导致了自动提交。正如您所提到的,存储过程似乎是事务的一部分。为了完成和帮助像我这样困惑的程序员,这是MySQL文档中的一条注释,在解析器将BEGIN视为BEGIN的开始的所有存储程序中。。。端块。在该上下文中使用START transaction开始事务