## 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專題五:持久化