采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
redis事务执行完成之后,会将redis中的对应订单的value改为司机id,然后提交事务,成功之后又删除了这个缓存;会不会出现一个用户提交了事务,但是还没有删除缓存,此时订单被另一个司机的事务给修改了? 是否可以将事务里面的逻辑改为直接删除,当前司机在事务中删除该订单缓存,如果事务提交成功则说明成功抢单。提交失败说明抢单失败。
我觉得你说的场景不存在,这里没有异步线程参与,都是同步执行的。一个司机的Redis提交成功,其他抢单Redis事务不可能提交成功。你去百度一下Redis单线程机制和Redis事务机制,就清楚了。
但是司机抢单的命令和删除的命令不是在一个事物里面,是分开的两个命令,多个司机连接redis服务去抢同一个单,如果redis执行命令队顺序为:司机1执行抢单事务->司机2执行抢单事务->司机1删除订单,这种情况下司机2不就是错误抢单了吗?
你把Redis事务当成数据库事务了,你先百度了解一下Redis事务机制,就能想明白这个问题
我认为这位同学提问是对的,他应该说的是订单数据被多次修改的问题而不是redis事务本身的问题.事务机制是防止事务发生期间数据被其他线程修改,但不能制止事务发生之后数据被二次修改.比如线程1执行事务将订单中司机id设为1,此时该事务结束且没有出错,修改成功,但此时还未执行删除语句,线程1暂停执行,此时另一线程2开始watch又通过事务修改司机id为2,因为数据未删除且watch期间没有其他线程修改数据,此操作执行成功.司机id变成2.此时数据被修改2次.
登录后可查看更多问答,登录/注册
50000+代码,300+技术点,慕课网明星讲师为你私人订制
4.9k 15
697 10
735 10
476 10
810 9