執行事務的大致代碼如下:
redisClient := GetRedisClient()
pipe := redisClient.TxPipeline()
err := pipe.ZAdd(k, arrZ...).Result()
//...
arr, err := pipe.Exec()
if err != nil {
log.Println(err, arr) //這里打印錯誤 EXECABORT Transaction discarded because of previous errors
}
陸續排除了以下可能:
- 是不是redis的內存滿了
- 是不是redis服務器保存了個什么狀態
- 是不是因為競爭太激烈,所以出錯
改了一行代碼后,錯誤不一樣了:
pipe := redisClient.Pipeline() //使用批量的管道,但是不使用事務
錯誤變為:ERR wrong number of arguments for 'zadd' command
認真看看,原來是特定條件下, arrZ這個數組可能會為空。
修改為:
redisClient := GetRedisClient()
pipe := redisClient.TxPipeline()
if len(arrZ)>0{
err := pipe.ZAdd(k, arrZ...).Result()
}
//...
arr, err := pipe.Exec()
if err != nil {
log.Println(err, arr)
}
問題解決。根本上還是命令參數錯誤導致的,但是事務模式下給出了錯誤的提示。