我正在研究MySQLi的回滚管理,我很好奇" begin_transaction"方法是。我看到的许多示例都是通过关闭autocommit来跳过它,然后执行一些返回成功值的查询,并根据返回值测试复合布尔值以提交或回滚多个语句。
它似乎不像" begin_transaction"方法实际上在我们希望基于所有查询的成功提交或回滚一组查询的场景中做任何有用的工作。我可以看到,它可能通过明确地声明一个事务来增加代码的可读性,但是有一个值,以及#34; begin_transaction"除可读性外?它真正的工作是什么?
答案 0 :(得分:1)
我总是在PHP中使用mysqli事务而陷入困境,因为涉及该主题的许多示例都涉及到关闭自动提交的方法。虽然可以,但与使用mysqli事务不同。至少从传统意义上讲,通常不会在查询中键入“ START TRANSACTION”。这是一个在PHP中使用mysqli事务而不弄乱autocommit设置的示例。如果有的话,如果我忘记了如何做的话,这对我自己是一个提醒。
<ng-container *ngIf="condition; else temp>Stuff</ng-container>
<ng-template #temp>This doesn't get rendered on its own, only if referenced</ng-template>
正如其他人所述,它在某种程度上受您的偏好影响。使用begin_transaction,您无需在查询前后切换自动提交。
答案 1 :(得分:0)
只有begin_transaction
与autocommit off
形成鲜明对比的是它不会弄乱autocommit
值,所以在commit/rollback
事务发生后begin_transaction
盯着autocommit
} com.adobe.aem:uber-jar
将与之前相同。
答案 2 :(得分:0)
正如其他答案中已经提到的那样,begin_transaction()
在不影响autocommit
的值的情况下启动了事务。在您调用commit()
或触发implicit commit之前,查询不会提交到数据库中。
如MySQL文档中所述:
启用了自动提交的会话可以通过以显式START TRANSACTION或BEGIN语句开始并以COMMIT或ROLLBACK语句结束的方式执行多语句事务。请参见第13.3.1节“ START TRANSACTION,COMMIT和ROLLBACK语句”。
如果在具有SET autocommit = 0的会话中禁用了自动提交模式,则该会话始终具有打开的事务。 COMMIT或ROLLBACK语句结束当前事务并开始新的事务。
这意味着begin_transaction()
和autocommit(FALSE);
之间的主要区别在于您是一次性交易还是连续交易。
使用begin_transaction()
进行一次简单的一次性交易将如下所示:
<?php
// Switch on error reporting with exception mode
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'username', 'password', 'db_name');
$mysqli->set_charset('utf8mb4');
try {
// Start transaction
$mysqli->begin_transaction();
$mysqli->query('INSERT INTO some_table(col2) VALUE(4)');
$mysqli->query('INSERT INTO some_table(col2) VALUE(4');
// Commit changes
$mysqli->commit();
} catch (\Throwable $e) {
// Something went wrong. Rollback
$mysqli->rollback();
throw $e;
}
这种方法比完全关闭自动提交模式更清晰。