redis事务
2021-04-24 15:05:26 0 举报
redis事物
作者其他创作
大纲/内容
客户端向服务器端发送EXEC命令
multiCmd
否
c2
watch \"name\"
redis是通过client.flags来判断该客户端是否正在处于事务中的。每个redis客户端都有自己的事务状态,这个事务状态保存在客户端状态的mstate属性里面。
客户端1
将所有执行结果返回给客户端
1、入队错误
操作队列可能会繁盛入队错误和执行错误:
multiState结构体
向客户端返回QUEUED
redisClient结构体
watched_keys
\"name\"
\"age\"
\"address\"
\"id\"
执行这个命令
结构体redisDB
客户端2修改了watch的key,客户端1的REDIS_DIRTY_CAS标识位将会被打开
set \"name\" \"zpl\"
c1
这个命令是否EXEC、DISCARD、WATCH或MULTI
reids通过字典watch_keys来保存正在监视的key
客户端的REDIS_DIRT_CAS是否已经被打开
执行成功
watch/unwatch是为了保持事务的隔离性,因为无法确保一个客户端执行一个key事务的时候别的客户端去修改这个key。(让事物之间产生隔离性)
[2]执行错误,最终队列中只有[2]没有执行成功,其他命令都不受影响
[0]
[1]
[2]
[3]
[4]
[5]
表示客户端c1、c2正在监听“name”如果“name”被修改则客户端c1、c2的REDIS_DIRTY_CAS标识位将会被打开
检查client.flags
这个客户端是否正处于事务
将命令放入事物队列
服务器接收到来自客户端的命令
multiCmd结构体数组(事务队列),以FIFO的方式保存的命令当提交收到提交事务的命令的时候就会遍历这个数组并依次执行
是
multi
拒绝执行客户端提交的事务
multiCmd中保存着命令具体信息
c3
执行客户端提交的事务
2、执行错误
c4
[2]入队错误,最终EXEC会报错,操作队列中的命令并不会被执行
multi:开启事务,此后所有的操作将会添加当前客户端的事务“操作队列”中。exec:提交事务。discard:取消事物,不在执行操作队列中的命令。这个不是回滚,回滚是执行了命令改变了数据再回滚会原来的数据,而redis事物命令只存储在操作队列中,还没有执行,所以不存在这回滚这种说法。(1、不执行操作队列中的命令 2、更改客户端事务标志client.flags)watch/unwatch:在事务开启前,可以对某个key注册“watch”,事务提交时会将会首先检测“watch”列表中的key集合是否被其他客户端修改,如果任意一个watch的key被修改则会导致事务被“discard”。
set \"name\" \"pele\"
客户端2
0 条评论
回复 删除
下一页