Redis事务的本质 是一组命令的集合
,并且有如下三个保证
事务中的所有命令都会序列化、按顺序地执行。
收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
事务在执行的过程中,其他客户端发送来的命令请求不会插入到事务执行命令序列中。
Redis事务的主要作用就是串联多个命令防止别的命令插队。
Redis事务不保证原子性: Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其 余的命令仍会被执行。
redis本身是不会存在并发问题的,因为他是单进程的,再多的command
都是one by one执行的。我们使用的时候,可能会出现并发问题,比如get
和set
这一对。
因为,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有
一个线程。客户端访问之间存在竞争。
因为存在多客户端并发,所以尽量必须保证一组操作的原子性。比如银行卡扣款问题,获取余额,判断,扣款,写回就必须构成事务,否则就可能出错。
一个事务从开始到执行会经历以下三个阶段:
从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。
组队的过程中可以通过discard来放弃组队。
操作举例:
组队、执行
组队、放弃组队
组队过程中某个命令出现了错误,执行时整个队列的所有命令都会被取消
组队过程没有出现错误,执行过程某个命令出了错误,只有报错的命令不会被执行,而其他的命令都会执行,不会回滚
即:Redis的事务不保证原子性
操作举例:
组队过程中,有失败命令
组队过程没有失败,执行过程中有失败