Elr*_*ele 3 php mysqli transactions
我正在研究 MySQLi 的回滚管理,我很好奇该方法的好处是什么begin_transaction()
。我看到的许多示例都通过关闭自动提交来完全跳过它,然后执行一些返回成功值的查询,并根据返回值测试复合布尔值以提交或回滚多个语句。
begin_transaction()
在我们希望根据所有查询的成功来提交或回滚一组查询的情况下,该方法似乎实际上并没有做任何有用的工作。begin_transaction()
我可以看到它可能通过显式声明事务来增加代码的可读性,但是除了可读性之外还有其他价值吗?它有什么实际作用?
正如其他答案中已经提到的,begin_transaction()
启动事务,而不影响 的值autocommit
。commit()
在您调用或触发隐式提交之前,查询不会提交到数据库中。
正如 MySQL 文档中所述:
\n\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
begin_transaction()
这意味着和之间的主要区别autocommit(FALSE);
在于您是否想要一次性事务或是否想要连续事务。
一个简单的一次性事务使用begin_transaction()
如下所示:
<?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 归档时间: |
|
查看次数: |
2400 次 |
最近记录: |