redis的事務是否具有原子性?

        衆所周知,redis可以通過MULTI EXEC DISCARD等來實現“事務”。但是事務應該具有ACID 四大特性,下面我就來探討一下redis的事務是否具有A——原子性。

        首先,我們看第一種情況,語句格式語法錯誤:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> hset myhash java 10
QUEUED
127.0.0.1:6379> hset myhash c 10
QUEUED
127.0.0.1:6379> hsetmyhash php 3
(error) ERR unknown command `hsetmyhash`, with args beginning with: `php`, `3`,
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> hgetall myhash
(empty list or set)

     可以看到這種情況在最後執行exec命令的時候提示事務錯誤,而且查看上面的的hash結構並沒有設置成功,那麼看起來redis的事務是具有原子性,但是真的是這樣嗎?我們看下面第二種情況吧,語句到運行的時候才產生錯誤:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> hset myhash java 10
QUEUED
127.0.0.1:6379> hset myhash c 10
QUEUED
127.0.0.1:6379> hset myhash php three
QUEUED
127.0.0.1:6379> hincrby myhash php 1
QUEUED
127.0.0.1:6379> hset myhash python 7
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (error) ERR hash value is not an integer
5) (integer) 1
127.0.0.1:6379> hgetall myhash
1) "java"
2) "10"
3) "c"
4) "10"
5) "php"
6) "three"
7) "python"
8) "7"

從上面的操作我們可以看出 hincrby myhash php 1 這條語句在執行的時候出現了錯誤 因爲php的value值不是一個整數值所以並不能增加一,但是可以通過後面的提示以及hgetall的驗證得知 這條語句前面和後面的正確的語句都執行了,並沒有回滾前面以及不執行後面,所以我們可以看出這並不符合事務的原子性:要麼全部不做 要麼全做,因此我們其實可以得出結論,redis的事務沒有原子性,redis只實現了部分事務。

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章