Redis事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务的执行过程中,会按照顺序执行
一次性,顺序性,排他性,执行一系列的命令
redis事务没有隔离级别的概念
所有的命令在事务中,并没有被直接执行,只有发起执行命令的时候才会执行!exec
redis单条命令是保证原子性的,但是事务不保证原子性
redis的事务*
* 开启事务(MULTI)
* 命令入队(....)
* 执行事务(exc)
127.0.0.1:6379> MULTI #开启事务 OK 127.0.0.1:6379(TX)> set k1 v1 #入队 QUEUED 127.0.0.1:6379(TX)> set k2 v2 QUEUED 127.0.0.1:6379(TX)> get k2 QUEUED 127.0.0.1:6379(TX)> set k3 k3 QUEUED 127.0.0.1:6379(TX)> exec #执行事务 1) OK 2) OK 3) "v2" 4) OK
127.0.0.1:6379> MULTI OK 127.0.0.1:6379(TX)> set k1 v1 QUEUED 127.0.0.1:6379(TX)> set k4 v4 QUEUED 127.0.0.1:6379(TX)> DISCARD OK 127.0.0.1:6379> get k4 (nil)
编译型异常(代码有问题,命令有错),事务所有命令都不会被执行
127.0.0.1:6379(TX)> set k1 v1 QUEUED 127.0.0.1:6379(TX)> set k5 v5 QUEUED 127.0.0.1:6379(TX)> getset k1 (error) ERR wrong number of arguments for 'getset' command 127.0.0.1:6379(TX)> exec (error) EXECABORT Transaction discarded because of previous errors.
运行时异常,如果事务队列中存在语法性,那么执行时,其它命令正常执行,错误命令抛出
127.0.0.1:6379> set k1 "asd" OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379(TX)> INCR k1 QUEUED 127.0.0.1:6379(TX)> set k2 v2 QUEUED 127.0.0.1:6379(TX)> get k2 QUEUED 127.0.0.1:6379(TX)> EXEC 1) (error) ERR value is not an integer or out of range 2) OK 3) "v2"