社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞
redis的事务是一个队列中,一次性、顺序性、排他性的执行一系列命令。
mysql的事务是原子性,一致性,隔离性,持久性,可回滚的一系列命令。
redis的事务严格来说是半事务,没有回滚概念,且一致性不强,有冤头债主的执行效果。redis会根据事务开头命令MULTI得知下列一系列命令都是需要要进行事务操作的命令,需要保证它们的一致性。所以redis会将命令放入队列,在结束事务或者放弃事务使一次性,顺序性的执行,且在事务操作期间,可以设置监视,被操作的键将会被锁定,具有排他性,一旦被操作的键被其他客户端修改,那么事务放弃。
主要使用的是MULTI,EXEC,DISCARD,UNWATCH,WATCH key
命令 | 含义 |
---|---|
MULTI | 标志一个事务块的开始 |
EXEC | 执行触发所有事务块内的命令 |
DISCARD | 取消事务,放弃执行事务块内所有命令 |
WATCH key[key…] | 监视一个或多个key,如果在事务执行前,这些key被其他命令改动,那么事务打断 |
UNWATCH | 取消WATCH命令对所有key的监视 |
如图,此处故意输错语法,导致事务块并没有执行。redis的 事务在事务块输入命令时如果产生错误,那么将不会执行该事务,具有一定的一致性
如图,因为username不是数字,无法递增,所以报异常,但是password的命令还是执行了
上面的例子,你会发现,redis并没有对被操纵的键进行锁定。在事务块中被执行的键,其他客户端依旧能够修改它。所以有了watch锁定被执行的键,一旦被执行的键被其他客户端修改,那么此次事务放弃
如图,第二张图是在事务块期间对username进行操作,导致此次事务失效,password和username并没有被执行
注意:
1.用unwatch将可以取消全部的监视
2.一旦事务块中涉及到的被监视键,那么当事务块进行exec后,该监视会被释放
3.watch指令类似于乐观锁
redis的事务分三阶段
redis的事务有三特性
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!