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