Redis(十三)——事务
1、什么是Redis的事务?
一次性 按顺序 执行多个命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
2、事务相关命令与使用
- MULTI :开启事务,redis会将后续的命令逐个放入队列中,然后使用EXEC命令来原子化执行这个命令系列。
- EXEC:执行事务中的所有操作命令。
- DISCARD:取消事务,放弃执行事务块中的所有命令。
- WATCH:监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令。
- UNWATCH:取消WATCH对所有key的监视。
3、事务出现错误处理
- 编译错误(入队错误):整个事务提交失败,不执行。
- 运行时错误:错误的命令将错就错,不影响其他正确的命令,不回滚。
4、事务的执行步骤
- 开启:以MULTI开始一个事务
- 入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
- 执行:由EXEC命令触发事务
5、为什么redis事务不支持回滚?
- 运行时错误不是是编程错误,回滚并不能解决错误。
- 不支持回滚,可以保持redis内部简单且快速。
6、如何理解redis的ACID
- 原子性atomicity:事务里的命令,要么不执行,要么全部执行,不是全部成功执行。
- 一致性consistency:定义是「没有包含非法、无效、错误的数据」。 入队错误不执行事务,不改变数据;运行时错误,不改变数据;意外宕机,通过持久化机制回到执行事务前,不改变数据。
- 隔离性isolation:多个事务不相互干扰,redis是单线程且事务里的命令按顺序执行。
- 持久性durability:不具备持久性,持久化机制由RDB和AOF保证,想保证持久性则需要「在事务结尾加个bgsave命令」或者「设置appendfsync参数为always」,影响性能,不推荐。