【发布时间】:2021-04-19 14:18:31
【问题描述】:
相关问题,但不是我想知道的,因为我很好奇 PHP mysqli lib/functions 的具体行为:
- What happens when a connection is closed mid-transaction?
- What happens to an uncommitted transaction when the connection is closed?
假设我有一些这样的代码(不管它的好坏做法):
# ... some code
$conn = new mysqli('localhost', 'widget-manager', 'secret-widgets', 'widgets');
$conn->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
if (false) {
$sql = "UPDATE widgets SET widget_num = 1 WHERE widget_id = 5";
$res = $conn->query($sql);
if ($res) {
$conn->commit();
} else {
$conn->rollback();
}
}
$conn->close();
# ... some more code
包含提交和回滚的if 将被跳过,mysqli 连接将在事务启动后但在调用提交或回滚之前关闭。
交易是否也会立即被销毁/结束/无论是什么适当的期限,还是会保留并可能阻止来自其他服务的其他查询?
【问题讨论】:
-
请分享更多细节。您想要涵盖的场景是什么?如果您的事务不包含更新或插入语句,那应该是什么问题?
-
我想知道事务是否会在数据库端保持打开状态,因为它没有被显式提交或回滚,并可能阻止其他查询。
-
你的代码很奇怪。它只
begin_transaction()一次,然后为每个单独的查询执行commit()。为什么要在这里使用事务? -
代码已被编辑得更直接一些,但这只是为了强调@KIKOSoftware 的可能情况的一个例子,而不是我们在生产中实际会遇到的情况。
-
如果连接关闭,为什么要保持事务打开?