请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

抢单问题?

redis事务执行完成之后,会将redis中的对应订单的value改为司机id,然后提交事务,成功之后又删除了这个缓存;会不会出现一个用户提交了事务,但是还没有删除缓存,此时订单被另一个司机的事务给修改了?
是否可以将事务里面的逻辑改为直接删除,当前司机在事务中删除该订单缓存,如果事务提交成功则说明成功抢单。提交失败说明抢单失败。

正在回答 回答被采纳积分+3

1回答

神思者 2022-07-05 15:11:59

我觉得你说的场景不存在,这里没有异步线程参与,都是同步执行的。一个司机的Redis提交成功,其他抢单Redis事务不可能提交成功。你去百度一下Redis单线程机制和Redis事务机制,就清楚了。

0 回复 有任何疑惑可以回复我~
  • 但是司机抢单的命令和删除的命令不是在一个事物里面,是分开的两个命令,多个司机连接redis服务去抢同一个单,如果redis执行命令队顺序为:司机1执行抢单事务->司机2执行抢单事务->司机1删除订单,这种情况下司机2不就是错误抢单了吗?
    回复 有任何疑惑可以回复我~ 2022-07-05 15:42:38
  • 神思者 回复 提问者 weixin_慕先生1250868 #2
    你把Redis事务当成数据库事务了,你先百度了解一下Redis事务机制,就能想明白这个问题
    回复 有任何疑惑可以回复我~ 2022-07-05 21:15:45
  • 我认为这位同学提问是对的,他应该说的是订单数据被多次修改的问题而不是redis事务本身的问题.事务机制是防止事务发生期间数据被其他线程修改,但不能制止事务发生之后数据被二次修改.比如线程1执行事务将订单中司机id设为1,此时该事务结束且没有出错,修改成功,但此时还未执行删除语句,线程1暂停执行,此时另一线程2开始watch又通过事务修改司机id为2,因为数据未删除且watch期间没有其他线程修改数据,此操作执行成功.司机id变成2.此时数据被修改2次.
    回复 有任何疑惑可以回复我~ 2022-07-12 01:12:40
问题已解决,确定采纳
还有疑问,暂不采纳
多端全栈项目实战,大型商业级代驾业务全流程落地
  • 参与学习       550    人
  • 解答问题       370    个

50000+代码,300+技术点,慕课网明星讲师为你私人订制

了解课程
意见反馈 帮助中心 APP下载
官方微信