事务是一个单独隔离操作:事务中的所有命令都会被序列化、按顺序的执行。事务在执行的过程中,不会被其他客户端发送来的命令请求打断。。
事务是一个原子操作: 事务中的命令要么全部被执行,要么 全部都不执行。
EXEC 命令负责触发并执行事务中的所有命令:
如果客户端在使用MULTI 开启一个事务之后,却因为断线而没有成功执行EXEC,那么事务中的所有命令都不会被执行。
另一方面,如果客户端成功在开启事务之后执行EXEC,那么事务中的所有命令都会被执行。
MULTI命令用于开启一个事务,它总是返回OK,MULTI执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放入到一个队列中,当EXEC命令被调用时,所有队列中的命令才会被执行。
另一方面,通过调用DISCARD,客户端可以情况事务队列,并放弃执行事务。
重点:
在开启事务后,命令入队如果失败,事务将会自动取消。
如果事务在执行中某条命令执行失败了,其他命令仍会被执行。
一种是命令入队失败,一种是执行失败。两者是不一样的。
Redis 事务不支持回滚Rollback 但是执行 Discard 放弃事务。
执行Discard 将会使,事务队列清空!
Watch 命令很有用,可以在事务中检测某个数据。
Redis集群后,无法使用事务。
c# StackExchange.Redis 使用事务。
IDatabase db = StackExchangeRedisHelper.GetDatabase();
var tran = db.CreateTransaction(); //开启事务 相当于MULTI命令
tran.AddCondition(Condition.KeyExists("key")); //相当于watch 命令 表示 只有在存在key时才会执行事务
tran.StringSetAsync("key1","value1"); //添加指令到事务队列
tran.StringSetAsync("key2","value2"); //添加执行到事务队列
tran.Excute(); //执行事务 相当于 EXEC命令 返回值是事务是否被执行
//tran.