php+mysql 怎么解决在对多表进行操作时,卡在中间的步骤?

系统信息
php 7.1
MariaDB 10
Laravel 5.6
centos 7

用户在使用余额下单时,提交订单,会有一系列的表操作,分别是
1,更新用户表的余额字段
2,往余额记录表里插入数据
3,调用第三方接口发送余额变动通知(微信模版通知)
4,创建订单
5,调用第三方接口发送下单成功通知(微信模版通知)

已经使用了Laravel的数据库事务了,用户在第1步扣完余额字段的数字后就卡住了,然后退出了程序,第2步的记录以及后面的数据都没有了,这种情况该怎么解决?

阅读 2.4k
2 个回答

没用过Laravel,但是解决思路一样的,哥子,我给你个伪代码:

$transaction = (new Transaction());

try {
    $setBalanceResult = UserModel::model()->set('balance',-100.00);
    
    if (!$setBalanceResult) throw new \Exception('修改余额失败!');
    
    $createBalanceRecord = BalanceRecord::model()->create([
        'user_id' => $user_id,
        'content' => 'XXX使用了100元'
    ]);
    if (!$createBalanceRecord) throw new \Exception('写入余额日志记录失败');
    
    $order = Order::model()->create([
        // 这里是订单数据
    ]);
    if (!$order) throw new \Exception('订单创建失败');
    
    // 把发消息添加到发送消息队列程序,通过队列任务程序从队列里取消息发送 start
    (new Queue())
        ->sendMsg('你的余额已经变动')
        ->sendMsg('下单成功');
    // 把发消息添加到发送消息队列程序,通过队列任务程序从队列里取消息发送 start 
    $transaction->commit(); // 没有问题提交事务   
} catch(\Exception $e) {
    $transaction->rollback(); // 出错事务回滚
    var_dump($e->getMessage()); // 打印错误,具体还可以进行异常返回到更上层
}

退出了程序是异常退出的话,会有日志的,可以贴出来吗

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题