文章目录
- Redis 事务
- 执行事务
- 放弃事务
- 编译性异常
- 运行时异常
Redis 事务
Redis 单条明令是原子性的,但Redis事务不保证原子性。
事务的本质就是:一组命令一起执行!一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!
一次性、顺序性、排他性。
Redis事务没有隔离级别的概念。 所有的命令在事务中,并没有被直接执行!只有在发起执行命令的时候才会执行!
原子性:要么一起成功,要么一起失败。
执行事务
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 v2
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
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)> set k1 v11
QUEUED
127.0.0.1:6379(TX)> discard # 放弃事务
OK
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379> get k1
"v1"
编译性异常
代码有问题,命令有错!事务中所有的命令都不会执行!
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)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> getset k3 # 错误的命令,客户端会给出错误提示,但不会断开事务
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379(TX)>
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> set k5 v5
QUEUED
127.0.0.1:6379(TX)> exec # 执行会报错
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k5 # 事务中的命令都没有执行
(nil)
运行时异常
如果事务队列中存在语法性错误,那么执行命令的时候,其他命令是可以执行的!错误命令会抛出异常!(所以说没有原子性)
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> incr k1 # 这是一条有问题的命令(执行时会报错)
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> incr k1 # 错误命令入队
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> exec # 有错误的命令报错了,其他命令成功了
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) OK