PHP - Manual: 事务控制
2024-12-23
事务控制已经从根本上被改变了,一个 SQL 事务是运行在一个数据库服务器中的 一个或者一组 SQL 语句。
默认情况下,插件并不关心 SQL 事务处理,插件会在每个 SQL 执行时进行负载均衡, 这就可能在事务执行的中间更换了连接。这对事务执行来说是不可以的,所以默认 配置的插件并不是事务安全的。
MySQL 负载均衡需要从事务开始到终止时,处于连续的状态。这种连续控制,可以使用 监控 API 调用,或者使用 SQL hints。具体插件可以支持哪种方式,基于您使用的 PHP 版本。API 调用监控,需要 PHP 5.4.0 以上版本。就像其他的 MySQL 负载均衡控制 一样,本插件无法自动识别事务的起始和终止边界。采用 API 监控方式是对现有应用 改变最小的方式。
可以在 examples section 找到使用 SQL hints 和 API 监控的范例。在 API 监控作用下,插件会关注事务的执行。
从 PHP 5.4.0 版本开始,mysqlnd 库允许调用 set_autocommit() 他用于检测 autocommit 设定。
PHP MySQL 扩展调用查询语句 (例如 SET AUTOCOMMIT=0|1) 或者 set_autocommit() 来控制 autocommit 设置。 如果通过 set_autocommit() 来设置,那么插件能够识别事务。 插件无法知道通过查询语句设定的 autocommit 状态。 set_autocommit() 会被 mysqli_autocommit() 和 PDO::setAttribute(PDO::ATTR_AUTOCOMMIT) 调用。
插件的配置 trx_stickiness=master 可以用来让插件识别事务处理。在这种情况下,如果 autocommit 被禁用,那么插件将终止负载均衡, 所有的语句都将交给 master执行,直到 autocommit 被启用。
应用程序若不想针对事务执行设置 SQL hints,那么就需要使用 API 监控来完成对 事务处理的支持,那么请注意一定要使用上面列出的,可以识别 autocommit 状态变化 的 API 调用。
基于 API 的事务处理边界识别,是从 PHP 5.5.0 和 本插件 1.5.0 版本开始的,并且 不仅仅识别 mysqli_autocommit() 也可以识别 mysqli_begin(),mysqli_commit() 和 mysqli_rollback()。
官方地址:https://www.php.net/manual/en/mysqlnd-ms.transaction.php