七、事务入门
在前面我们学习了redis的常用命令以及五种数据类型。大家是否都掌握了呢?其实这些还是很简单并且好记的。
这里重复一下链接地址:
Redis学习笔记(三)——Redis常用命令入门——字符串类型命令
Redis学习笔记(四)——Redis常用命令入门——散列类型
Redis学习笔记(五)——Redis常用命令入门——列表类型
Redis学习笔记(六)——Redis常用命令入门——集合类型
Redis学习笔记(七)——Redis常用命令入门——有序集合类型
下面我们接着学习数据库知识里面一个必不可少的内容——事务(Transaction)。在关系型数据库中我们已经很了解了,事务就是要么都执行,要么都不执行。这个应该不管在怎样的数据库中都是一样的。
1、基本命令
首先我先介绍下Redis事务的关键字:MULTI…EXEC。下面举个例子。
我们在Redis中添加数据,由于没有办法想关系型数据库一样一条语句把所有的数据全部添加进去(没有外键的情况下,有外键需要先添加外键所属的那条数据)。像是我们添加文章(这里以只添加文章title和文章的标签为例,这里我们假设要添加的文章id为10),我们需要如下操作:
这里我们发现,当输入MULTI时,Redis返回OK,告诉我们他已经知道这里是事务的开始了,接下来我们输入命令,他都会告诉我们已经加入到队列里了,当输入EXEC时,按顺序执行,并按顺序返回执行结果。
Redis在这里还有个处理,就是在事务中,如果在发送EXEC命令前客户端断了,则Redis会清空事务队列,而在EXEC后断开,则所有的命令还是会继续执行。
2、错误处理
如果事务在执行过程中出错了,Redis是怎么处理的呢?这里分两种情况:语法错误、运行错误。
(1)语法错误。比如参数不对或者命令不存在。
这种情况下,只要有一个命令有语法错误,Redis不会显示QUEUE而是报告错误信息,执行EXEC命令后Redis也会说有错误存在。语法正确的命令也不会执行(注意一下这里在2.6.5之前的版本会忽略错误的语句而执行其他正确的命令)
(2)运行错误。运行错误是在发送命令到队列时无法发现的错误。
比如先执行SET a 1,又执行SADD a 2,再执行SET a 3,这样在事务队列里面是发现不了的,但是在执行了EXEC时确实可以发现的。并且还会返回那条语句对应的错误信息。
但是这里不同的是,Redis在运行错误时,仅仅只是会忽略错误的语句,但是正确的语句依然会执行。所有我们GET a,返回的是3。
最后还有一点我们需要知道。Redis的事务没有关系数据库提供的回滚,也让Redis执行的更快并简洁。但是为此开发者必须在事务执行出错后自己收拾剩下的烂摊子。
不过在保持语法正确并且很好的规划好数据库(保证键的规范等)的使用,是不会出现上述运行错误的。