gpt4 book ai didi

php - 如何在 PHP 中管理嵌套数据库事务?

转载 作者:行者123 更新时间:2023-11-29 12:33:14 24 4
gpt4 key购买 nike

我有一个方法deleteUser(..),它执行一个mysql查询并调用另一个方法logAction(..),该方法调用另一个mysql查询。

在此类方法中处理事务的最佳方式是什么?

伪代码示例:

function deleteUser($userId) {
$db->execute('BEGIN TRANSACTION');

$userCount = $db->execute("DELETE FROM users WHERE id=$userId");

logAction('USER DELETED');

$db->execute('INSERT INTO ... another action');

$db->execute('COMMIT');
}

function logAction($action) {
$db->execute('BEGIN TRANSACTION');

$db->execute('INSERT INTO logtable ... ACTION');
if (error) {
$db->execute('ROLLBACK');
}

$db->execute('COMMIT');
}

如您所见,我从deleteUser() 方法调用logAction,并遇到“BEGIN TRANSACTION”两次。 logAction() 方法在 deleteUser() 完成之前过早调用“COMMIT”。

有没有办法在这种嵌套方法中管理事务?

最佳答案

MySql不支持嵌套事务。还有

Beginning a transaction causes any pending transaction to be committed

http://dev.mysql.com/doc/refman/5.5/en/commit.html

但是您需要在一个事务中执行这些查询或单独执行它们。您坚持在事务内运行您的方法。

function deleteUser($userId) {
if ($this->notInTransation()) throw new NotInTransactionException('not in transaction');

$userCount = $db->execute("DELETE FROM users WHERE id=$userId");

logAction('USER DELETED');

$db->execute('INSERT INTO ... another action');

}

function logAction($action) {
if ($this->notInTransation()) throw new NotInTransactionException('not in transaction');
$db->execute('INSERT INTO logtable ... ACTION');
}

这将确保您的查询 rune 在一个事务内。使用这种方法,您应该将开始、回滚、提交放在层次结构中较高的位置,或将查询放在较低的位置。

附注您可以使用 autocommit用于检查正在启动的事务的变量。

关于php - 如何在 PHP 中管理嵌套数据库事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27173508/

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