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"