使用 commit() 时是否需要 save() ?
is save() necessary when commit() is used?
我意识到 save()
和 commit()
将执行相同的数据库事务两次。
例如
if (isset($userId))
{
$update = true;
$user->load(array('id=:id', array(':id' => $userId)));
}
$user->designation_id = $f3->get('POST.designation_id');
$user->firstname = $f3->get('POST.firstname');
$user->lastname = $f3->get('POST.lastname');
$user->save(); //update made to users table
$this->db->begin();
foreach ($userTeams as $teamId)
{
$sqlArray[] = sprintf('INSERT INTO %s (internal_team_id, users_id) VALUES (%d,%d)', 'users_internal_team', $teamId, $user->get('_id'));
}
$this->db->exec($sqlArray); //update made to some other table
$this->db->commit();
echo $this->db->log();
die();
日志将显示在 "users"
table 中执行的以下事务:
...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()
也会为我做同样的事情?
TL;DR
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;
不同之处在于,在第一个示例中,如果在 INSERT
语句期间发生错误(如重复输入),则 UPDATE
语句不会被取消(也称为“rolled” back"), 而在第二个例子中它会。
在 F3 中,等效示例为:
$db->exec('UPDATE users etc.');
$db->exec('INSERT INTO users_internal_team etc.');
和
$db->begin();
$db->exec('UPDATE users etc.');
$db->exec('INSERT INTO users_internal_team etc.');
$db->commit();
请注意,如果您将语句数组传递给 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
一定包含相同的语句。
后一点我可能是错的,但无论如何,你使用的顺序是正确的。
我意识到 save()
和 commit()
将执行相同的数据库事务两次。
例如
if (isset($userId))
{
$update = true;
$user->load(array('id=:id', array(':id' => $userId)));
}
$user->designation_id = $f3->get('POST.designation_id');
$user->firstname = $f3->get('POST.firstname');
$user->lastname = $f3->get('POST.lastname');
$user->save(); //update made to users table
$this->db->begin();
foreach ($userTeams as $teamId)
{
$sqlArray[] = sprintf('INSERT INTO %s (internal_team_id, users_id) VALUES (%d,%d)', 'users_internal_team', $teamId, $user->get('_id'));
}
$this->db->exec($sqlArray); //update made to some other table
$this->db->commit();
echo $this->db->log();
die();
日志将显示在 "users"
table 中执行的以下事务:
...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()
也会为我做同样的事情?
TL;DR
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;
不同之处在于,在第一个示例中,如果在 INSERT
语句期间发生错误(如重复输入),则 UPDATE
语句不会被取消(也称为“rolled” back"), 而在第二个例子中它会。
在 F3 中,等效示例为:
$db->exec('UPDATE users etc.');
$db->exec('INSERT INTO users_internal_team etc.');
和
$db->begin();
$db->exec('UPDATE users etc.');
$db->exec('INSERT INTO users_internal_team etc.');
$db->commit();
请注意,如果您将语句数组传递给 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
一定包含相同的语句。
后一点我可能是错的,但无论如何,你使用的顺序是正确的。