Redis-事务

事务

回顾

我们在MySQL中学习的事务具有ACID原则

原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性(Consistency)

事务前后数据的完整性必须保持一致。

隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

Redis中的事务

事务的本质即:一组命令一起执行,不允许被插队。

在Redis中,单条命令是原子性的,但是事务不保证原子性

事务没有隔离级别的概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 开启事务
127.0.0.1:6379> multi
OK

# 命令入队
127.0.0.1:6379> hset user:1 name zhima
QUEUED
127.0.0.1:6379> hset user:1 age 19
QUEUED
127.0.0.1:6379> hset user:1 address Suzhou
QUEUED
127.0.0.1:6379> hmget user:1 name age address
QUEUED
# 执行事务
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) 1) "zhima"
2) "19"
3) "Suzhou"

# 中途放弃事务
127.0.0.1:6379> discard

编译时异常:即代码本身又问退,比如127.0.0.1:6379> asdmlk (error) ERR unknown command 'asdmlk'命令行会直接报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> getset k2
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k3
(nil)
127.0.0.1:6379> get k2
(nil)

可以发现所有的命令都没有执行。

运行时异常:如果事务队列中存在这种错误,其他语句照常执行,该语句不执行,抛出异常

1
2
3
4
5
6
7
8
9
10
11
127.0.0.1:6379> set k1 var
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range
2) "var"
给作者买杯咖啡吧~~~