事物:由MULTI ... EXEC控制
就是把多个命令放在一个queue中,一起去执行
语法错误:也就是编译阶段出错,那么整个queue都被丢弃,全部不执行;
执行错误:也就是运行阶段出错,只要是正确的命令都会执行,那怕是在错误命令后面的命令,也会继续执行,并且不会有回滚操作,为了保证redis的性能,如果需要回滚操作,那么redis就必须记录所有操作的日志,影响性能。
一、正常事物
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a a
QUEUED
127.0.0.1:6379> set b b
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
二、语法错误:QUEUE中的所有命令都丢弃,不执行
127.0.0.1:6379> multi
OK
127.0.0.1:6379> sets a a
(error) ERR unknown command 'sets'
127.0.0.1:6379> set b b
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379>
三、运行错误:正确命令都执行,不管是在错误前还是后,遇错误不回滚
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 1
QUEUED
127.0.0.1:6379> lpush a 1 2 3
QUEUED
127.0.0.1:6379> set b 2
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
127.0.0.1:6379>
redis实现乐观锁:使用watch ... multi ... exec
127.0.0.1:6379> watch a
OK
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> set b 1
OK
//在此时在另一个客户端set a 2 ,则后面执行失败
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI
127.0.0.1:6379>