Php 使用commit()时是否需要save()?

Php 使用commit()时是否需要save()?,php,fat-free-framework,Php,Fat Free Framework,我意识到save()和commit()将执行相同的数据库事务两次 例如 日志将显示在“用户”表中执行的以下事务: ...other log information related to other tables.. UPDATE `users` SET `designation_id`=3,`lastname`='Mali' WHERE `id`=134 Wed, 11 Apr 2018 11:39:20 +0200 (0.5ms) UPDATE `users` SET `designati

我意识到
save()
commit()
将执行相同的数据库事务两次

例如

日志将显示在
“用户”
表中执行的以下事务:

...other log information related to other tables..

UPDATE `users` SET `designation_id`=3,`lastname`='Mali' WHERE `id`=134 Wed, 11 Apr 2018 11:39:20 +0200 (0.5ms) 
UPDATE `users` SET `designation_id`=3,`lastname`='Mali' WHERE `id`=134
那么这是否意味着我可以删除
$user->save()
,而
$this->db->commit()
也会对我这样做;博士
save()
commit()
是两件不同的事情,所以你不应该跳过
save()

SQL后台 在SQL中,您可以编写:

UPDATE users SET designation_id=3,lastname='Mali' WHERE id=134;
INSERT INTO users_internal_team (internal_team_id, users_id) VALUES;(999,134)
BEGIN;
UPDATE users SET designation_id=3,lastname='Mali' WHERE id=134;
INSERT INTO users_internal_team (internal_team_id, users_id) VALUES;(999,134)
COMMIT;
或者你可以写:

UPDATE users SET designation_id=3,lastname='Mali' WHERE id=134;
INSERT INTO users_internal_team (internal_team_id, users_id) VALUES;(999,134)
BEGIN;
UPDATE users SET designation_id=3,lastname='Mali' WHERE id=134;
INSERT INTO users_internal_team (internal_team_id, users_id) VALUES;(999,134)
COMMIT;
区别在于,在第一个示例中,如果在
INSERT
语句期间发生错误(如重复条目),则不会取消
UPDATE
语句(也称为“回滚”),而在第二个示例中则会取消

在F3中,等效示例为:

$db->exec('UPDATE users etc.');
$db->exec('INSERT INTO users_internal_team etc.');

请注意,如果将语句数组传递给
exec()
方法,它们将自动嵌入事务中:

$db->exec([
  'UPDATE users etc.',
  'INSERT INTO users_internal_team etc.',
]);
// automatically calls $db->begin() and $db->commit()
你的代码 在代码中,您正在调用
user->save()
,这会触发
$db->exec('INSERT etc')
$db->exec('UPDATE etc')
,具体取决于前面
$user->load()的结果

这是一种说法

日志中出现了两条相同的语句,而当您跳过对
$user->save()
的调用时,其中一条语句仍会出现,这一事实让我认为
$sqlArray
必须包含相同的语句


在后一点上我可能是错的,但无论如何,您使用的序列是正确的。

commit()
只能在SQL中使用。由于DB映射器也适用于其他引擎,因此有一个
save()
方法。不,必须保存数据。提交只应用一组在BeginTransaction和EndTransaction之间完成的
save()
,或者如果在BeginTransaction和EndTransaction之间出现问题,那么这些技术都是回滚的。我假设save作用于数据库表,而提交则将事务标记为完成。这意味着一旦回滚,您的数据库看起来就像从未发生过事务一样。所以他们的做法不同,一个保存到表中,另一个在成功后完成。但是当我删除user->save()部分时,它也可以正常工作,并且只执行一个更新事务。当user->save()和commit()同时使用时,会执行两个更新事务。但是我建议您仔细阅读手册中的事务概念,
$sqlArray
中没有这样的语句。。我检查了一遍又一遍。。不知道是什么原因造成的。。但似乎只有
commit()
完成了
save()
的工作。。删除
save()
会得到预期的结果。这真的很奇怪。我只是做了一个测试用例,但无法重现您的问题。您使用的是旧版本吗?您还应该确保查询实际执行了两次。它可以执行一次并记录两次。顺便说一句,我更新了答案以通知您,当您将语句数组传递给
exec()
时,
$db->begin()
$db->commit()
将自动执行。我已经为该表定义了一个更新/插入触发器,这就是我发现该语句执行两次的原因。感谢您更新了答案。我真的很感激。