Redis系列学习(三)之java api接入及事务 (补)
一、 引言
本篇为补充《Redis系列学习(三)之java api接入及事务》文章里事务的例子
二、 事务例子补充
没加事务
private void testTransaction(){
System.out.println("======================测试事务==========================");
jedis.set("sex", "man");
jedis.incr("sex");
jedis.set("hello", "world");
}
结果如下:
数据库查看:
先添加“sex=man”数据,然后调用”incr”命令做加1操作,由于值”man”不是整型,所以加1操作发生了运行时错误,抛错之后的命令不会继续执行,我们看到运行时发生的错误,但还是成功。
如果加上事务会怎样?上篇文章讲“运行时错误,即使发生的错误,已经修改的值并不会回滚,并且后面命令会继续执行”,下面验证一下。
private void testTransaction(){
System.out.println("======================测试事务==========================");
Transaction transaction = jedis.multi();
transaction.set("sex", "man");
transaction.incr("sex");
transaction.set("hello", "world");
transaction.exec();
}
IDE结果如下图:
中间“transaction.incr(“sex”);”命令返回了执行错误消息,但后面命令还是继续执行。
数据库如下图
虽然发生了运行时错误,但并没有报异常错误,而且发生错误的地方后面命令还继续执行。
运行时发生的错误,即使错误发生(redis接收并执行,并没有把它当作错误来处理),后面的命令也会继续执行。
三、 watch命令
WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控的键值)
例子:
private void testTransaction(){
System.out.println("======================测试事务==========================");
jedis.watch("sex");
jedis.set("sex", "man2");
Transaction transaction = jedis.multi();
transaction.set("country", "china");
transaction.set("sex", "female");
transaction.set("hello", "world");
List<Object> results = transaction.exec();
System.out.println(results.toString());
}
数据库结果如下图
例子里,原始数据是“sex=man”,代码里先使用watch监控sex字段,然后修改sex=man2,虽然在事务命令队列里再将set设置”female”,但结果sex=man2。由些我们可以知道由于在开启事务之前sex被修改了,导致之事务里的命令全部不会执行,这里强调“事务队列里命令全部不会执行”