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();
});
如果您觉得本文对您有用,欢迎捐赠或留言~
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=867