带有回调的Yii2中的Db事务
发布时间:2020-12-13 15:58:22 所属栏目:PHP教程 来源:网络整理
导读:我有简单的代码,在Yii2中使用数据库事务,这会更新用户余额并为用户余额历史记录添加新记录. //User modelpublic function changeBalance(UserBalanceHistory $balance){ $balance-balance = $this-balance; $balance-user_id = $this-id; $this-balance = $t
我有简单的代码,在Yii2中使用数据库事务,这会更新用户余额并为用户余额历史记录添加新记录.
//User model public function changeBalance(UserBalanceHistory $balance) { $balance->balance = $this->balance; $balance->user_id = $this->id; $this->balance = $this->getBalance() + $balance->getDelta(); $transaction = Yii::$app->db->beginTransaction(); try { if ($balance->save() && $this->save()) { $transaction->commit(); return true; } } catch (Exception $e) { Yii::error($e->getMessage()); } $transaction->rollBack(); } 我应经常使用数据库事务来保存数据完整性.但是像上面那样处理数据库事务需要很多代码行,所以我创建了以下函数来动员我的代码: function dbTransaction(callable $callback) { $transaction = Yii::$app->db->beginTransaction(); try { //if callback returns true than commit transaction if (call_user_func($callback)) { $transaction->commit(); Yii::trace('Transaction wrapper success'); } } catch (Exception $e) { $transaction->rollBack(); throw $e; } $transaction->rollBack(); } 有了这个功能,我可以处理这样的事务: //User model public function changeBalance(UserBalanceHistory $balance) { dbTransaction( function () use ($balance) { $balance->balance = $this->balance; $balance->user_id = $this->id; $this->balance = $this->getBalance() + $balance->getDelta(); return $balance->save() && $this->save(); } ); } 如您所见,第二种方式非常适合使用交易.但是在这一点上,我不确定dbTransaction函数是否正常工作或者也不正确?代码审查和备注指出了潜在的问题.谢谢 解决方法
删除你的代码$transaction-> rollBack();在最后一行之前,因为此代码总是回滚并取消您的事务
function dbTransaction(callable $callback) { $transaction = Yii::$app->db->beginTransaction(); try { //if callback returns true than commit transaction if (call_user_func($callback)) { $transaction->commit(); Yii::trace('Transaction wrapper success'); } } catch (Exception $e) { $transaction->rollBack(); throw $e; } //$transaction->rollBack(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |