go-redis 事務提交


前提用的是go-redis

RedisClient := redis.NewClient(&redis.Options{
Addr: "10.1.1.70:6379",
Password: "", // no password set
DB: 0, // use default DB
})

// 開啟一個TxPipeline事務
pipe := RedisClient.TxPipeline()
defer pipe.Close()

//這里是放命令
pipe.SetNX("Freeze:DL201544a00007:a00002:a1:300", "200",30*time.Second)
pipe.SetNX("Freeze:DL201544a00008:a00002:a1:400", "400",30*time.Second)
pipe.SetNX("Freeze:DL201544a00009:a00002:a1:500", "500",30*time.Second)
pipe.SetNX("Freeze:DL201544a0000991123:a000091123:a1:592100", "5923100",30*time.Second)
// 通過Exec函數提交redis事務
r, err := pipe.Exec()
if err!=nil {
//取消提交
pipe.Discard()
}
//這里調用exec執行剛剛加的命令,redis的事務和mysql事務是不一樣的,一般情況下,這里的err出錯是在編譯期間出錯,運行期間是很少出錯的
//mysql的事務是具有原子性,一致性,隔離性 ,持久性



redis事務三階段:

開啟:以MULTI開始一個事務
入隊:將多個命令入隊到事務中,接到這些命令並不會立即執行,而是放到等待執行的事務隊列里面
執行:由EXEC命令觸發事務
redis事務三大特性:

單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。
沒有隔離級別的概念:隊列中的命令沒有提交之前都不會實際的被執行,因為事務提交前任何指令都不會被實際執行,也就不存在”事務內的查詢要看到事務里的更新,在事務外查詢不能看到”這個讓人萬分頭痛的問題
不保證原子性:redis同一個事務中如果有一條命令執行失敗,其后的命令仍然會被執行,沒有回滾

所以,如果出現,第一條數據處理是true,其他的處理是false,那需要把其中的為true的數據,撤銷其操作,這里也只能手動去撤銷

var resultmap []map[string]string
resultmap=make([]map[string]string,0)
for _, v := range r {
params := fmt.Sprintf("%s", v)
res:=strings.Split(params," ")
fmt.Println("key=",res[1])
//處理結果
fmt.Println("res=",res[6])

if res[6]=="true" {
var model map[string]string
model=make(map[string]string,0)
model["key"]=res[1]
model["result"]=res[6]
resultmap=append(resultmap, model)
}
}
這堆代碼是為了事務處理結果不一致導致的問題if len(r)!= len(resultmap){
   for _,vb:=range resultmap{

RedisClient.Del(vb["key"]).Result()

}
}

這里就執行了對事務的撤銷操作,可以通過手動來實現事務的一致性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM