美文网首页
第十九章 事务

第十九章 事务

作者: 今天不想掉头发 | 来源:发表于2019-07-29 10:06 被阅读0次

Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。

事务的实现

事务从开始到结束经历以下三个阶段:

  1. 事务开始(MULTI打开客户端flags属性中的REDIS_MULTI标识)
  2. 命令入队(当处于事务状态时,如果是除EXEC、DOSCARD、WATCH、MULTI之外的命令,会放入事务队列中)
  3. 事务执行(执行EXEC命令来执行事务队列中的命令)

WATCH命令的实现

WATCH命令是一个乐观锁,可以在执行EXEC之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改了,如果是的话服务器会拒绝执行事务(通过将将监视该数据库键的REDIS_DIRTY_CAS标识打开,标识该数据库键已经被修改)。

事务的ACID性质

对于Redis事务队列中的命令要么全部执行,要么一个都不执行(但是不支持回滚)
注意:Redis中的原子性可能与一般的原子性有一些不同,对于事务队列中的命令,如果是像下面这样


image.png

事务中有一个未知的命令get,在执行前就能够发现,那么整个事务都不会执行。但是如果是像下面这样


image.png
对于字符串类型的msg,实际上是不能当做列表键进行RPUSH操作的,但是只有真正执行事务的时候才能发现,对于这样情况,事务中其他正确的命令依然会得到正确的执行(感觉有点违背原子性的特点了)

同时需要注意,Redis使用单线程来执行事务(即事务队列中的命令),并且在执行事务期间也不会对事务进行中断,所以Redis的事务总是以穿行的方式运行的,并且事务也总是具有隔离性的。

Redis的持久性是由Redis使用的持久化模式决定的(RDB,AOF),只有在AOF持久化模式下appendfsync选项为always时,事务才具有持久性。


image.png

相关文章

网友评论

      本文标题:第十九章 事务

      本文链接:https://www.haomeiwen.com/subject/eddvrctx.html