redis系列文章目录
前言
redis是异步单线程执行,也就是一个线程对应所有的客户端。哪个客户端上传了命令,线程就会执行,所以并不能保证一个客户端的多个命令,不会被其它其它客户端的命令插队,通过事务机制可以实现批处理某一个客户端所有命令执行完在执行下一个客户端的命令。
一、redits的事务
- 目前不具备数据的原子性。
- 指当前客户端的开启的事务
- redis不满足数据库的ACID属性
- 原子性(atomicity):一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性
- 一致性(consistency):一个事务在执行之前和执行之后,数据库都必须处于一致性状态。类似one by one 效果,不会给其它事务打断。
- 隔离性(isolation):一个事务的执行不能不被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务时隔离的,并发执行的各个事务之间不能相互干扰
- 持久性(durability):一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中
属性 | redis | mysql |
---|---|---|
原子性 | no | yes |
一致性 | yes | yes |
隔离性 | yes | yes |
持久性性 | No | Yes |
二、开启事务
redis > MULTI
三、redis事务的一致性
为了保证事务的一致性,在开启事务之前必须要用watch命名监视要操作的记录。如果被监视的数据被其它客户端修改了,当前正在执行的事务会给自动关闭。
监视数据
redis > WATCH key1 key2
开启事务后的所有操作都不会立即执行,只有执行EXEC命令的时候才会批处理执行,如果这期间有其它客户端修改了记录,当前的事务会被自动关闭
redis > INCR num
redis > RPUSH user 9502
redis > EXEC
四、关闭事务
- Redis并没有事务的回滚机制,所以并不能保证原子性
- 事务在没有提交执行前,即没有执行EXEC前,是可以取消事务的。如果事务已经提交执行,就无法取消了
redis > MULTI
redis > .....
redis > DISCARD
五、总结
- 学习了Redis事务机制的原理
- 掌握管理Redis事务的命令