您的位置:首页 > 数据库 > Redis

Redis事务

2020-07-13 05:35 92 查看

一.事务的实现
三个阶段:

  1. 事务开始
  2. 命令入队
  3. 事务执行

    事务队列:
    以下为例
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set "name" "cc"
QUEUED
127.0.0.1:6379> set "sex" "man"
QUEUED
127.0.0.1:6379> get "name"
QUEUED
127.0.0.1:6379> get "sex"
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) "cc"
4) "man"
  • 最先入队的set命令被放在事务队列的索引0位置
  • 第二入队的set命令被放置在事务队列索引1位置
  • 第三入队的get命令被放置到事务队列的2位置
  • 第四入队的get命令被放置在事务队列的3位置

二.WATCH乐观锁实现

WATCH命令是一个乐观锁,它可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,监控被监视的键最少有一个被修改了,如果是,服务器则拒绝执行事务,并向客户端返回代表执行失败的空回复。

三.事务的ACID特性

  • 原子性:事务队列中的命令要么全部执行,要么全部不执行。但是Redis不支持事务的回滚,即使在整个队列执行过程中出现错误,整个事务也会执行下去,知道将队列中的所有命令都执行完成。
  • 一致性:即在事务执行前数据库是一致的,在执行后也是一致的。
  • 隔离性:即使多是事务并发的执行,各个事务之间也不会相互影响,并且在并发状态下执行事务和串行执行事务产生的结果完全相同。
  • 耐久性:当一个事务执行完毕时,执行这个事务所得的结果已经被保存到永久性储存介质中,即便事务执行完成后服务器停机,事务的执行结果任然不会丢失。

四.测试事务

命令:

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set "name" "cc"
QUEUED
127.0.0.1:6379> set "sex" "man"
QUEUED
127.0.0.1:6379> get "name"
QUEUED
127.0.0.1:6379> get "sex"
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) "cc"
4) "man"

当在执行multi命令后执行的命令出错,在执行exec的时候就会出错。

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SELECT "name" "ptm"
(error) ERR wrong number of arguments for 'select' command
127.0.0.1:6379> set "name" "ptm"
QUEUED
127.0.0.1:6379> get "name"
QUEUED
127.0.0.1:6379> set "author" "ps"
QUEUED
127.0.0.1:6379> get "author"
QUEUED
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: