Redis事务和关系型数据库事务的区别:
Redis事务:Redis 单条命令保证原子性,但是Redis事务不保证原子性,它是命令的集合,一个事务中所有命令都会被被序列化,一次性按顺序执行,没有事务隔离级别的概念,并且只有发起exec执行指令时,才会开始执行。
关系型数据库事务:原子性,一致性,隔离性,持久性,在出错时可以回滚,要么全部成功,要么全部失败。
Redis事务执行:
- 开启事务(multi)
- 命令入队
- 执行事务 (exec)
队列执行
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 v1
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) OK
没有原子性
127.0.0.1:6379(TX)> SET k3 v3
QUEUED
127.0.0.1:6379(TX)> get k4
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (nil)
取消事务
127.0.0.1:6379> MULTI
OK
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)
//编译时错误,exec会报错,所有命令不执行
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> SETE K1
(error) ERR unknown command SETE
, with args beginning with: K1
,
127.0.0.1:6379(TX)> SET K1 V1
QUEUED
127.0.0.1:6379(TX)> SETE K1
(error) ERR unknown command SETE
, with args beginning with: K1
,
127.0.0.1:6379(TX)> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> GET K1
(nil)
运行时错误 , 正确的会执行
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 haha
QUEUED
127.0.0.1:6379(TX)> INCR k1 //字符串不可以增值
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range
127.0.0.1:6379> get k1
"haha"