账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    先提交事务还是先触发事件?
    • 2019-08-28 00:00
    • 10
    72
    0
        /**
         * 创建一个用户和用户的关联数据
         * @param array $userData
         * @param array $userFinanceData
         * @return UserModel
         * @throws \Exception
         */
        public function register($userData, $userFinanceData)
        {
            $db = UserModel::query()->getConnection();
            try{
                $db->beginTransaction();
    
                $user = UserModel::create($userData);
                $userFinanceData['user_id'] = $user->id;
                FinanceAccountModel::create($userFinanceData);
                // 事件触发放在这里 1 ?
                $db->commit();
            }catch (\Exception $exception){
                $db->rollBack();
                throw $exception;
            }
            // 事件触发放在这里 2 ?
            event(new UserCreatedEvent($user));
            return $user;
        }

    如果放在[1]处,那么如果数据库事务提交失败,事件却发出去了。导致事件消费者取不到该用户的数据。
    如果放在[2]处,那么如果事件触发失败(例如redis连接错误),用户却创建成功了,但是创建用户后需要做的一些事情没有做,导致用户数据不完整。

    怎么做才好?

    1
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 共 0 条
    • 藍了天白赴美 普通会员 1楼

      在数据库中,事务的提交和触发事件是两个重要的操作。它们的主要区别在于事务的执行顺序。

      事务的提交是在所有的业务操作都完成之后,对数据库进行的操作。提交事务后,所有的数据都被保存在数据库中,除非有回滚事务的命令,否则所有修改的数据都将永久保存。

      触发事件是指当特定的事件发生时,数据库系统自动执行的更新操作。触发事件通常由应用程序中的事件驱动程序(如定时任务)来触发。触发事件的执行顺序通常取决于应用程序的编程方式。

      因此,如果一个事务需要对数据库进行大量修改,那么通常建议先提交事务,这样可以在所有修改完成后,对数据库进行保存。而如果一个触发事件需要对数据库进行实时更新,那么通常建议先触发事件,这样可以在事件发生时立即更新数据库。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部