在 MySQLi 中使用“begin_transaction”方法有什么好处?

Elr*_*ele 3 php mysqli transactions

我正在研究 MySQLi 的回滚管理,我很好奇该方法的好处是什么begin_transaction()。我看到的许多示例都通过关闭自动提交来完全跳过它,然后执行一些返回成功值的查询,并根据返回值测试复合布尔值以提交或回滚多个语句。

begin_transaction()在我们希望根据所有查询的成功来提交或回滚一组查询的情况下,该方法似乎实际上并没有做任何有用的工作。begin_transaction()我可以看到它可能通过显式声明事务来增加代码的可读性,但是除了可读性之外还有其他价值吗?它有什么实际作用?

Dha*_*man 5

正如其他答案中已经提到的,begin_transaction()启动事务,而不影响 的值autocommitcommit()在您调用或触发隐式提交之前,查询不会提交到数据库中。

\n

正如 MySQL 文档中所述:

\n
\n

启用了自动提交的会话可以通过使用显式 START TRANSACTION 或 BEGIN 语句启动并使用 COMMIT 或 ROLLBACK 语句结束来执行多语句事务。请参见第 13.3.1 节,\xe2\x80\x9cSTART TRANSACTION、COMMIT 和 ROLLBACK 语句\xe2\x80\x9d。

\n

如果在 SET autocommit = 0 的会话中禁用自动提交模式,则该会话始终有一个打开的事务。COMMIT 或 ROLLBACK 语句结束当前事务并开始新事务。

\n
\n

begin_transaction()这意味着和之间的主要区别autocommit(FALSE);在于您是否想要一次性事务或是否想要连续事务。

\n

一个简单的一次性事务使用begin_transaction()如下所示:

\n
<?php\n\n// Switch on error reporting with exception mode\nmysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);\n$mysqli = new mysqli(\'localhost\', \'username\', \'password\', \'db_name\');\n$mysqli->set_charset(\'utf8mb4\');\n\ntry {\n    // Start transaction\n    $mysqli->begin_transaction();\n\n    $mysqli->query(\'INSERT INTO some_table(col2) VALUE(4)\');\n    $mysqli->query(\'INSERT INTO some_table(col2) VALUE(4\');\n\n    // Commit changes\n    $mysqli->commit();\n} catch (\\Throwable $e) {\n    // Something went wrong. Rollback\n    $mysqli->rollback();\n    throw $e;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这种方法比完全关闭自动提交模式更清晰。。

\n