gpt4 book ai didi

php - MySQLi API 以及事务如何工作和提交

转载 作者:行者123 更新时间:2023-11-29 22:04:41 25 4
gpt4 key购买 nike

关于使用 PHP 的 API对于 MySQL 事务支持,我想知道自动提交

例如,我不确定默认情况下它是如何工作的,但理想情况下我希望所有查询自动提交除非我明确地启动一个事务,如下所示:

$db->begin_transaction();
$db->query(...);
$db->query(...);
$db->commit();

作为一个相关问题,我注意到 begin_transaction() 直到 PHP 5.5 才被引入,那么是否有可能在 5.5 之前获得行为?

我知道有 $db->autocommit() 但这是否意味着如果我想要上述行为,我需要默认启用它,然后执行 $db-> autocommit(false) 在任何事务之前,然后 $db->autocommit(true) 之后?

最佳答案

这是documentation关于事务和自动提交设置。

引用该文档:

By default, MySQL runs with autocommit mode enabled. This means that as soon as you execute a statement that updates (modifies) a table, MySQL stores the update on disk to make it permanent. The change cannot be rolled back.

当我读到这篇文章时,它的工作方式是这样的:

假设您在不使用事务的情况下进行查询。您在自动提交开启的情况下执行INSERT,并且该INSERT 会立即发生(即立即存储到磁盘)。 更新?它立即发生。

现在想象一下您关闭自动提交并以相同的方式进行查询。上面的引用意味着,如果您在关闭自动提交的情况下执行 INSERT 命令,该命令不会立即存储到磁盘。那么 INSERT 会发生什么?再次引用文档:

After disabling autocommit mode by setting the autocommit variable to zero, changes to transaction-safe tables (such as those for InnoDB or NDBCLUSTER) are not made permanent immediately. You must use COMMIT to store your changes to disk or ROLLBACK to ignore the changes.

因此,简而言之,使用自动提交是实现事务的一种不同方式。在 MySQL 中你可以这样做:

START TRANSACTION;
INSERT INTO table VALUES (1, 2, 3);
COMMIT;

或者你可以这样做:

SET autocommit=0;
INSERT INTO table VALUES (1, 2, 3);
COMMIT;

还要注意,当您更改 autocommit 值时,会发生隐式提交 - 因此这样做是等效的:

SET autocommit=0;
INSERT INTO table VALUES (1, 2, 3);
SET autocommit=1;

您可以在 PHP 中以同样的方式执行操作,使用 $db->begin_transaction();$db->autocommit(false); 启动事务,最后执行 $db->commit(); 。就我个人而言,我发现 begin_transaction 方法更清晰。

关于php - MySQLi API 以及事务如何工作和提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32271979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com