关于redis事务机制打断

关于redis事务机制打断

老师您好,在这节课神思者老师提出redis的事务机制在运行的时候是不能打断的,我有些不太理解:

在开启事务后采用watch监测数据,如果监测的数据被其他客户端的操作改变了,该事物不就被打断终止了,这样的逻辑不是可以理解为redis事务机制是可以被打断的么?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好!同学说的打断和老师说的事务机制打断不是一个内容,老师说的redis 事务相当于批处理。意思是开启事务后47、48、49行代码先保存下来,等到执行pipeline.execute()时,再将47、48、49代码发送到redis执行。

https://img1.sycdn.imooc.com//climg/652c9bdd09cba82d12720362.jpg

这样能达到要47、48、49行代码一起执行,中间不能被其它客户端打断。不能是其它客户端A执行了pipeline.incr("kill_num")代码后,再返回到我们这个客户端再执行pipeline.rpush("kill_user",user_id)这个代码。意思是一个客户端开始事务后要么multi()到pipeline.execute()之间的代码都执行,要不就都不执行

https://img1.sycdn.imooc.com//climg/652c98cf098090b410950294.jpg

而同学理解的redis 事务机制打断应该是客户端A与客户端B完整的事务之间的打断。客户端A在修改数据,则客户端B不会同时执行事务,修改数据。可以理解为客户端与客户端整体事务是可以打断的。看同学怎么理解。


祝学习愉快~

  • 懒惰的围脖 提问者 #1

    1.老师可不可以理解为在同一时间段内在redis线程内只能有一个事务在执行。
    2.之前我的问题:在pipline.watch(args)内监视的中的redis参数如果被redis中另外的客户端修改了正在执行事务中被监视的参数,这个行为应该被理解为一个事务'杀死'另外一个事务,而不是用打断这个概念比较好
    3.正在执行的事务在开启事务pipline.multi()到提交事务pipline.execute()之间的代码命令是属于批处理的范畴之中的,只能存在两个结果要么全部成功执行(理解为不被打断),要么由于另外一个客户端修改数据的影响该客户端的事务被'杀死',结束的是受影响的整个客户端而不是理解为打断pipline.multi()到提交事务pipline.execute()之间的代码。

    2023-10-16 15:46:12
  • 好帮手慕小猿 回复 提问者 懒惰的围脖 #2

    同学,你好!1、对,同一时间段只能有一个事务执行

    2、同学理解的也对,正在执行的"杀死了"当前的事务

    3、理解的也对,受影响的是当前的整个客户端,而不是pipline.multi()到pipline.execute()之间的代码。

    祝学习愉快~

    2023-10-16 17:04:28
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师