代码:
func main() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
pipe := rdb.TxPipeline()
for i := 0; i < 10000; i++ {
pipe.Set(ctx, "a", "abc", time.Second)
}
fmt.Println("Start")
pipe.Exec(ctx)
fmt.Println("End")
}
当控制台打印Start
时,表示事务已经开始执行,然后我尝试在shell中连接到redis并执行get
命令,为什么命令没有被阻塞(此时End
还没有被打印),这正常吗?因为事务中的命令还没有执行
127.0.0.1:6379> get a
(nil)
127.0.0.1:6379>
1条答案
按热度按时间rjee0c151#
这是正常的,在Redis上启动一个事务不会锁定服务器上的任何东西,当你调用EXEC时,所有排队的命令都会自动执行。
唯一提供的锁定是使用WATCH命令,如果修改了任何WATCHed键,该命令将使事务失败。
您可以阅读更多关于Redis交易here的信息。