加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

带有回调的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();
 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读