Redis学习笔记——第19章 事务
第19章 事务
19.1 事务的实现
19.1.1 事务开始
使用multi命令开启一个事务
通过修改客户端的flags字段为REDIS_MULTI
19.1.2 命令入队
当开启事务之后,exec、discard、watch、multi命令立即执行,而其他命令会放入一个队列中,并返回Queued
19.1.3 事务队列
客户端的mstate保存事务队列,事务保存了参数与执行函数,是一个先进先出的队列
19.1.4 执行事务
遍历事务列表并将结果全部返回给客户端(一次性)
19.2 watch命令的实现(乐观锁)
用以在exec之前监视数据库键,当事务修改了这些键时,事务exec失败
19.2.1 使用watch命令监视数据库键
被监视的键保存为一个字典,值为监视这个键的客户端链表
19.2.2 监视机制的触发
当客户端监视了某个键时,若键被修改,则将监听该键的客户端标识改为REDIS_DIRIY_CAS来使其感知
19.2.3 判断事务是否安全
在执行exec命令时,查看标识是否为REDIS_DIRIY_CAS,若是,则不执行任务
19.2.4 一个完整的watch事务执行过程
在一个客户端加了watch,开启事务之后,若其他客户端修改了watch中操作的键之后,会将watch这些键的客户端标识修改为REDIS_DIRIY_CAS,该客户端再执行exec命令便会被拒绝
19.3 事务的ACID属性
19.3.1 原子性
如果在入队期间发现命令错误,则不会执行,但是如果在执行期间发生异常,则不会回滚整个事务,因此不具有原子性
19.3.2 一致性
redis数据库具有一致性,不会因为特殊情况出现导致redis数据库丢失这种特性
19.3.3 隔离性
redis数据库是单线程数据库,则一定具有隔离性
19.3.4 持久性
只有每次执行事务前使用SAVE命令才可以保证事务具有持久性,但是这种做法效率低下,所以可以认为redis数据库不具有持久性