世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程。 ——摘自周志明

Redis事物

redis事物定义:

  》Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

  》Redis事务的主要作用就是串联多个命令防止别的命令插队。(redis单线程的,所以不会线程抢占的情况)

  命令队列

  multi 、exec 、discard

  》multi命令开始,后面的命令都会放入命令队列(quenen),但是不会执行,直到执行exec命令,才会顺序执行命令队列中的命令。

  》如果想放弃组队,通过discard命令来通知redis.

事物的错误处理有两种:

  》第一种命令组队时,报错。在执行时,整租所有的命令都会被取消。

  》第二种是组队时不报错,执行时个别命令出错。则只有报错的命令不会执行,而其他命令正常执行,且不回滚

WATCH key [key ...]

  》在执行multi之前,先执行watch key.监视一个(或多个)key,如果执行事务之前,key被其他命令改了,那么该事务不能执行。

UNWATCH key

  》取消监视

  注意:如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了

两种锁机制:

  》悲观锁:当一开始操作(读取、更改)数据时,就锁住该数据不让其他人操作,直到自己不再操作,才会释放锁。

  》乐观锁:操作数据时,不会锁住资源,这样并发性好,但是会有一个版本号,当更新时,也会更新版本号。其他人会与版本号做对比,以确保读到的是最新的数据。

 redis事务的三特性

  》单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

  》没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这个 让人万分头痛的问题 。

  》不保证原子性 :Redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚 。

posted @ 2018-12-23 15:44  白杯与咖啡  阅读(147)  评论(0编辑  收藏  举报