redis事务实现
MULTI 命令的执行标志一个事务的开始,redis事务是一系列命令的隔离操作,事务中所有命令(除了MULTI、EXEC、WATCH、DISCARD)都会被放入到事务列队,直到客户端发送EXEC命令后,事务列队里的命令按序执行,因为是单线程的,所以不会被打断,事务中所有命令要么全部执行,要么全部不执行,如果执行过程中出错,也不会回滚。
- redis不支持事务回滚机制,但是会检查事务每一个命令是否有错误,但是不会检查程序员自己的逻辑错误,例如对String类型的数据执行List类型的操作。
- 使用AOF方式持久化的时候,redis会使用write(2)命令将事务写入到磁盘中,如果中途进程被杀死,则只有部分命令写入磁盘,此时重启的时候会报错并退出,可使用reis-check-aof命令修复,它会移除aof中不完整的事务信息。
事务中的异常
1、在EXEC执行前的异常,入队的命令可能出错,例如语法错误、参数错误等,现在版本的redis是记录错误的命令,EXEC执行的时候自动放弃此事务(早期版本的做法是只执行成功的命令,忽略失败命令)
2、在EXEC执行之后的异常命令,没有做其他的处理,即使某些命令执行失败了,其他命令仍然会继续执行。
为什么redis不支持回滚?
redis不像关系型数据库那样需要处理复杂的逻辑关联,redis的应用场景是数据的高效存取,只要编码逻辑没有错误,一般不会有错误产生,正因为没有复杂的事务逻辑,redis才能能保持高效快速。