第19章 事务

来源:互联网 发布:淘宝网首页不显示图片 编辑:程序博客网 时间:2024/05/18 08:02


通过MULTI、EXEC、WATCH等命令实现事务。


1. 事务的实现

1.1 事务开始

MULTI命令的执行标志着事务的开始


通过在客户端状态的flags属性中打开REDIS_MULTI标识来完成,


1.2 命令入队

事务状态:

  • 客户端发送的命令为EXEC、DISCARD、WATCH、MULTI四个命令其中的一个,那么服务器立即执行这个命令
  • 其他命令,而是将这个命令放入一个事务队列里面,然后向客户端返回QUEUED回复。

1.3 事务队列

客户端都有自己的事务状态,mstate


1.4 执行事务


2. WATCH命令的实现


一个乐观锁,可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了。

如果是,服务器拒绝执行事务,并向客户端返回代表事务执行失败的空回复


2.1 使用WATCH 命令监视数据库键

每个数据库都保存着一个watched_keys字典,这个字典的键是某个被WATCH命令监视的数据库键,字典的值是一个链表,链表中记录了所有监视响应数据库键的客户端。


2.2 监视机制的触发

multi.c/touchWatchKey


2.3 判断事务是否安全

REDIS_DIRTY_CAS



3. 事务的ACID性质


3.1 原子性


Redis不支持事务回滚机制,即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。


3.2 一致性


3.3  隔离性


3.4 耐久性



0 0
原创粉丝点击