## Redis专题二:事务
[TOC]
### 事务的概念
- 有序性:事务中所有的命令都是有序执行的
- 原子性:要么事务中所有命令都执行,要么都不执行;
如果`EXEC`命令被调用,则事务中所有命令都会执行。如果`EXEC`命令调用前发生错误,则事务中所有命令都不执行
### 事务命令
| 命令 | 解释 | 返回值 |
| --- | --- | --- |
| `MULTI`| 事务开始的标志 |`OK`|
| `[redis command]`|输入redis正常的命令,这些命令会加入到一个队列中,直到`EXEC`命令被调用,这些命令才会被执行,如`SET connections 12` |`QUEUED`|
| `DISCARD`| 中止事务执行,一般写在在`MULTI`执行后 |`OK`|
| `WATCH `| 为事务key提供check-and-set (CAS)检查,如果在`EXEC`调用前`WATCH `监控的keys发生变化,则会中止事务的执行,一般写在`MULTI`执行前 |`OK`|
| `EXEC `| 顺序执行队列中排好队的命令,如果用了`WATCH`且keys发生变化,则事务会中止,否则事务执行所有命令 |返回每一条`[redis command]`的结果组成的列表|
> DISCARD
~~~
> SET foo 1
OK
> MULTI
OK
> INCR foo
QUEUED
> DISCARD
OK
> GET foo
"1"
~~~
> MULTI与EXEC
~~~
> MULTI
OK
> INCR foo
QUEUED
> INCR bar
QUEUED
> EXEC
1) (integer) 1
2) (integer) 1
~~~
> WATCH
~~~
WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC
~~~
### 事务中错误
- 语法错误:如错误参数的个数 ,错误的command名等
- 赋值错误:如对一个string类型的key调用list的操作方法等
> 当事务中的`[redis command]`存在赋值错误时,事务不会停止执行命令,如下面的`LPOP connections`对一个strings类型的key使用list的`LPOP`方法,产生错误`WRONGTYPE Operation against a key holding the wrong kind of value`
语法错误:
~~~
MULTI
+OK
INCR a b c
-ERR wrong number of arguments for 'incr' command
~~~
赋值错误:
~~~
> MULTI
OK
> SET connections 10
QUEUED
> INCR connections
QUEUED
> LPOP connections
QUEUED
> GET connnections
QUEUED
> SET connections 10
QUEUED
> EXEC
1) OK
2) 11
3) WRONGTYPE Operation against a key holding the wrong kind of value
4) (nil)
5) OK
~~~
- JavaCook
- Java专题零:类的继承
- Java专题一:数据类型
- Java专题二:相等与比较
- Java专题三:集合
- Java专题四:异常
- Java专题五:遍历与迭代
- Java专题六:运算符
- Java专题七:正则表达式
- Java专题八:泛型
- Java专题九:反射
- Java专题九(1):反射
- Java专题九(2):动态代理
- Java专题十:日期与时间
- Java专题十一:IO与NIO
- Java专题十一(1):IO
- Java专题十一(2):NIO
- Java专题十二:网络
- Java专题十三:并发编程
- Java专题十三(1):线程与线程池
- Java专题十三(2):线程安全与同步
- Java专题十三(3):内存模型、volatile、ThreadLocal
- Java专题十四:JDBC
- Java专题十五:日志
- Java专题十六:定时任务
- Java专题十七:JavaMail
- Java专题十八:注解
- Java专题十九:浅拷贝与深拷贝
- Java专题二十:设计模式
- Java专题二十一:序列化与反序列化
- 附加专题一:MySQL
- MySQL专题零:简介
- MySQL专题一:安装与连接
- MySQL专题二:DDL与DML语法
- MySQL专题三:工作原理
- MySQL专题四:InnoDB存储引擎
- MySQL专题五:sql优化
- MySQL专题六:数据类型
- 附加专题二:Mybatis
- Mybatis专题零:简介
- Mybatis专题一:配置文件
- Mybatis专题二:映射文件
- Mybatis专题三:动态SQL
- Mybatis专题四:源码解析
- 附加专题三:Web编程
- Web专题零:HTTP协议
- Web专题一:Servlet
- Web专题二:Cookie与Session
- 附加专题四:Redis
- Redis专题一:数据类型
- Redis专题二:事务
- Redis专题三:key的过期
- Redis专题四:消息队列
- Redis专题五:持久化