eloquent之数据库事务

最近做了一个消息通知的功能,具体的实现思路是参考http://www.jianshu.com/p/f4d7827821f1/这篇文章来实现的。

用户进行一些敏感操作时,将会有消息通知告知管理员用户进行了哪些操作。将用户的操作信息作为通知,保存在notify表中,然后当有管理员登录,就会拉取该管理员对应的消息通知。拉取的方式是比对当前登录用户的user_notify表中最大notify_id,是否与notify表中该用户对应的id是否一致,如果user_notify中的notify_id比较小,说明有了新的通知消息,此时应该拉取消息到user_notify表中。

我遇到的问题是,总是出现多次重复拉取的现象。

这个问题,有时出现,有时不出现的,排查了好久,最终确定为是数据库事务方面的问题。拉取notify表中的数据到user_notify表中批量插入时,此时的数据比较多,插入可能需要一段时间,但是此时又有了新的请求过来,要求再次插入信息到user_notify表中,这样多次不同的请求干扰,就导致了获取user_notify表中的最大notify_id不正常,比如数据批量还没插入完成,此时的最大id获取的就是错误的,所以就会发生了多次插入。

解决办法是,使用eloquent中的transaction处理方式。想要在一个数据库事务中运行一连串操作,可以使用 DB facade 的 transaction 方法。像这样:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
});
如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注