redis 事务

Posted 是的哟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis 事务相关的知识,希望对你有一定的参考价值。

事务执行时,不会中断去执行其他命令

不支持回滚,执行时某个命令出错,其他命令也会继续执行

 

multi

set "name" "zhangsan"

get "name"

set "age" 18

get "age"

exec

 

multi 将客户端从非事务状态切换到事务状态

非事务状态,客户端发送的命令会被服务器立即执行

事务状态,服务器会根据客户端不同的命令来执行不同的操作:

exec、discard、watch、multi会立即执行,

其他命令会入队,服务器为每个客户端维护一个队列

客户端发送exec命令时,服务器会遍历这个客户端的事务队列,执行里面的所有命令

发送discard时,会清空队列,并将客户端切换到非事务状态

 

watch是一个乐观锁,可以在执行exec前监视任意数量的key,

执行exec时如果有key被修改了,服务器将拒绝执行事务,并向客户端返回事务失败的空回复

watch "name" //客户端A监视name

multi //客户端A开启事务

set "name" "zhangsan" //客户端A修改name

set "name" "lisi" //客户端 B 修改name

exec //客户端A执行事务

 

有个watched_keys字典,字典键是被watch的key,

字典值是一个链表,保存着所有监视这个key的客户端

所有修改命令,如set等,执行后都会检查是否有客户端在监视刚刚被修改的key

若修改过,则打开该客户端的redis_dirty_cas标识。

exec执行事务前,服务器会检查redis_dirty_cas标识,来判断事务是否安全,不安全则不执行

 

redis事务的ACID

原子性 atomicity 要么都执行,要么都不执行 redis事务满足原子性

一致性 consistency 若数据库在执行事务前是一致的,那么执行事务后也是一致的

"一致"指的是数据符合数据库本身的定义和要求,没有非法或无效的错误数据

入队错误:命令不存在或格式不正确,redis会拒绝该事务

执行错误:例如对key执行了错误类型的操作,这种命令在执行时会被识别出来,并进行相应的错误

处理,不会对数据库做出任何修改,也不会影响一致性

服务器停机:没做持久化会恢复到空白状态,做了持久化会恢复到以前的某个一致性状态。

隔离性 isolation 多个事务并发执行,不会相互影响,和串行执行事务的效果一样

redis是单线程的,且服务器在执行事务期间不会中断事务,所以事务总是以串行方式执行的。

耐久性 durability 事务执行完,结果会被保存到永久介质里,即使停机结果也不会丢失

没做持久化时,不具备耐久性;RDB不会及时保存,也不具备耐久性;AOF且appendfsync选项为always时,具备耐久性,appendfsync为其他值时,不具备耐久性。

 

以上是关于redis 事务的主要内容,如果未能解决你的问题,请参考以下文章

Redis事务系列之一Redis事务详解

Redis事务操作

Redis事务入门及命令

redis学习redis事务

Redis的事务

Redis的事务和watch