redis基本的事务操作

redis基本的事务操作

redis事务的本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行的过程中会按顺序依次执行

一次性、顺序性、排他性

redis事务没有隔离级别的概念!所有的命令在事务在并没有被执行,只有发起执行命令的时候才会执行

redis的单条命令行是保证原子性的,但是事务不保证原子性。

redis的事务

  • multi开启事务
  • 命令入队
  • exec执行事务

正常执行事务

127.0.0.1:6379[3]> flushdb # 清空数据库
OK
127.0.0.1:6379[3]> multi #开启事务
OK
#命令入队
127.0.0.1:6379[3]> set k1 v1 
QUEUED
127.0.0.1:6379[3]> set k2 v2 
QUEUED
127.0.0.1:6379[3]> get ke
QUEUED
127.0.0.1:6379[3]> get k2
QUEUED
127.0.0.1:6379[3]> set k3 v3
QUEUED
127.0.0.1:6379[3]> exec #执行事务
1) OK
2) OK
3) (nil)
4) "v2"
5) OK

放弃事务

# 放弃事务 discard
127.0.0.1:6379[3]> flushdb
OK
127.0.0.1:6379[3]> multi
OK
127.0.0.1:6379[3]> set k1 v1
QUEUED
127.0.0.1:6379[3]> set k2 v2
QUEUED
127.0.0.1:6379[3]> set k3 v3
QUEUED
127.0.0.1:6379[3]> discard
OK
127.0.0.1:6379[3]> get k3
(nil)

编译型异常: 代码有问题!命令有错!命令语法出错,事务会执行失败

127.0.0.1:6379[3]> flushdb
OK
127.0.0.1:6379[3]> multi
OK
127.0.0.1:6379[3]> set k1 v2
QUEUED
127.0.0.1:6379[3]> set k2 v2
QUEUED
127.0.0.1:6379[3]> set k3 v3
QUEUED
127.0.0.1:6379[3]> getset k3
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379[3]> get k3
QUEUED
127.0.0.1:6379[3]> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379[3]> get k3
(nil)

运行时异常(数字除0):语法没有错误,但是命令使用不对,其他的命令可以正常执行,所以事务不保证原子性

127.0.0.1:6379[3]> flushdb
OK
127.0.0.1:6379[3]> multi
OK
127.0.0.1:6379[3]> set k1 "v1"
QUEUED
127.0.0.1:6379[3]> incr k1
QUEUED
127.0.0.1:6379[3]> set k2 v2
QUEUED
127.0.0.1:6379[3]> set k3 v3
QUEUED
127.0.0.1:6379[3]> get k3
QUEUED
127.0.0.1:6379[3]> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) OK
5) "v3"
posted @ 2022-02-26 15:58  Oh,mydream!  阅读(30)  评论(0编辑  收藏  举报