- Redis 事务时一个单独的隔离操作 :事务中的所有命令都会序列化,按顺序地执行。
- 事务在执行的过程中,不会被其他客户端发送来的命令请求所打断,中停。
队列中的命令(指令),在没有提交前都不会实际被执行。
事务执行过程中,如果有指令执行失败,其他的指令仍然会被执行,没有回滚 。3. Redis 关于事务相关指令 Multi、Exec、discard和 “watch & unwatch”
MySQL中的事务是支持回滚的,而 Redis 中的事务是不支持回滚的。
Redis 事务指令示意图:
3.1 快速入门(演示 Redis 事务控制)
- 从输入 multi 命令开始,输入的命令都会依次进入命令队列 中,但不会执行雷同(MySQL的 start transaction 开始事务)。
- 输入 Exec 命令后,Redis 会将之前的命令队列中的命令依次执行(雷同于 MySQL的 commit 提交事务)。
- 组队的过程中可以通过 discard 来放弃组队(雷同 MySQL的 rollback 回滚事务)
- 阐明:Redis 事务和 MySQL 事务本质是完全不同的。 ——> MySQL中的事务是支持回滚的,而 Redis 中的事务是不支持回滚的。
- 一个请求(用户)想购买 6 张票
- 一个请求(用户)想购买 5 张票
- 一个请求(用户)想购买 1 张票
一共只有10张票,但是并发开始,三个用户(三个请求),买 6 张,买 5 张,买 1 张票的。同时进入购票系统,并发同时候进入判定,都显示还剩10张票(还没有减),最后执行减票,超卖了 2张票。4.1 “悲观锁” 解决
4.2 “乐观锁” 解决
- 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。
- 这样别人/其他请求想要拿到这个数据都会被(block 锁上,由于被锁了就无法修改/拿到数据了),只有直到在他前面的人拿到数据/修改数据后,将锁释放了,它才气将数据拿到。
- 悲观锁是锁设计理念 ,传统的关系型数据库里面就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等等,都是在做操作之前先上锁(防止被其他的人/请求操作,修改了数据,导致数据不同等。)
4.3 watch & unwatch
- 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁。
- 但是在更新的时候会判定一下,在此期间别人/请求是否有去更新了这个数据,可以使用版本号等机制。版本号机制:就是当这个数据被修改了,那么就会产生一个版本信息,如果这个版本信息,与你一开始对应,并应该获取的版本信息不同等,那么就修改失败/无法修改数据(或者说获取的版本信息不同等,拿不到该数据信息)
- 乐观锁适用于多读的应用范例,这样可以提高吞吐量。 Redis 就是利用这种 check-and-set 机制实现事务的。
- 乐观锁是锁设计理念。
unwatch:复制代码
- # A 连接
- 127.0.0.1:6379> watch k1
- OK
- 127.0.0.1:6379> multi
- OK
- 127.0.0.1:6379(TX)> incrby k1 1
- QUEUED
- 127.0.0.1:6379(TX)> exec
- 1) (integer) 100
- 127.0.0.1:6379> get k1
- "100"
复制代码
- # B 连接
- 127.0.0.1:6379> watch k1
- OK
- 127.0.0.1:6379> multi
- OK
- 127.0.0.1:6379(TX)> incrby k1 100
- QUEUED
- 127.0.0.1:6379(TX)> exec
- (nil)
- 127.0.0.1:6379> get k1
- "100"
- 127.0.0.1:6379>
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |