跳至主要內容

2.16 Redis事务 🎉

刘春龙...大约 2 分钟数据库redis

2.16 Redis事务 🎉

在数据库层面,事务是指一组操作,这些操作要么全都被成功执行,要么全都不执行

数据库事务的四大特性:

  • A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行;

  • C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;

  • I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;

  • D:Duration,持久性,即事务完成后,对数据库数据的修改被持久化存储。

Redis事务是一组命令的集合,一个事务中的所有命令都将被序列化,按照一次性、顺序性、排他性的执行一系列的命令。

Redis事务三大特性:

  • 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断;

  • 没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”。

  • 不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚;

Redis事务执行的三个阶段

  • 开启:以MULTI开始一个事务;

  • 入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面;

  • 执行:由EXEC命令触发事务;

Redis事务基本操作 💎

MultiExecdiscard

事务从输入Multi命令开始,输入的命令都会依次压入命令缓冲队列中,并不会执行,直到输入Exec后,Redis会将之前的命令缓冲队列中的命令依次执行。组队过程中,可以通过discard来放弃组队。

  • 正常执行
MULTI
set id 12
get id
get ids  # 不会影响
incr t1
incr t1
get t1
EXEC
  • 放弃事务
MULTI
set name z3
set age 29
incr t1
DISCARD  # 以上操作都不会执行
  • 正常执行
ULTI
set name z3
get name
incr t1
get t1
set email #(error) ERR wrong number of arguments for 'set' command
exec  # (error) EXECABORT Transaction discarded because of previous errors.

警告

命令集合中含有错误的指令(注意是语法错误),均连坐,全部失败。

上次编辑于:
贡献者: 刘春龙
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.7