我的MySQL数据库中有accounts
和money
个表,所以如果任何行添加到钱,accounts.balance
应该更新,首先我通过Active Record和Transaction
$transaction = $connection->beginTransaction();
try {
if ($createModel->save()) {
$account = $createModel->accounts;
$account->balance += $createModel->amount;
if ($account->save())
$transaction->commit();
}
} catch(Exception $e){
$transaction->rollBack();
}
现在我将其更改为$createModel->save()
并创建触发器以更新accounts
表格,
CREATE TRIGGER before_insert_money BEFORE INSERT ON money
FOR EACH ROW
BEGIN
UPDATE accounts SET balance=balance+NEW.amount WHERE id=NEW.accounts_id;
END;
触发器足以确保更新帐户表而不使用事务?如果您的答案为否,我如何组合触发器,事务和ActiveRecord?
答案 0 :(得分:0)
恕我直言,你的方法已经足够好了。虽然我建议对当前的触发器实现进行2次更改(首先是重要的第二次,你可以忽略):
您可能需要AFTER
而不是BEFORE
触发器。这意味着您想要UPDATE
到accounts
确保成功完成INSERT
成钱。 BEFORE
触发器通常用于更改要插入或更改的行的值,或阻止对该行的操作(例如,违反约束或发出SIGNAL
)。
由于你的触发器是一个语句触发器,你可以放弃BEGIN ... END
阻止。这样您就不需要更改DELIMITER
。
据说你的触发器可能看起来像
TRIGGER before_insert_money
BEFORE INSERT ON money
FOR EACH ROW
UPDATE accounts
SET balance = balance + NEW.amount
WHERE id = NEW.accounts_id;
仍然的问题是否允许更新和删除您的资金记录?如果是,那么您必须实施补充AFTER UPDATE
和AFTER DELETE
触发器才能正确维护帐户余额。