目 录CONTENT

文章目录

Redis事务

Sakura
2023-09-05 / 0 评论 / 0 点赞 / 22 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于57天前,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

一: 事务

  • 数据库事务 : 在一次会话中的所有 sql 语句 , 要么全部成功 , 要么全部失败

  • Redis 事务 : 可以一次执行多个命令 , 本质是一组命令的集合。一个事务中的所有命令都会序列化 , 按顺序地串行化执行而不会被其它命令插入 , 不许加塞

一个队列中,一次性、顺序性、排他性的执行一系列命令

二: Redis 事务命令

三: Redis 事务操作

1. 正常执行

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)> exec
1) OK
2) OK
3) OK

2. 放弃事务

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v11
QUEUED
127.0.0.1:6379(TX)> set k2 v22
QUEUED
127.0.0.1:6379(TX)> discard
OK

3. 全体连坐

Redis 对于错误有两种处理方式

  1. 语法编译都不通过 : exec 执行无法通过 , 例如: gett Redis 直接返回错误 , 所有的命令都不执行

  2. 语法没问题但是执行出错 , 例如: incr 一个string类型的key , Redis 对于成功的命令成功 , 失败的失败

Redis不提供事务回滚的功能,开发者必须在事务执行出错后,自行恢复数据库状态

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1111
QUEUED
127.0.0.1:6379(TX)> set
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.

4. 冤头债主

注意: 不和传统数据库一样 , 不一定要么一起成功要么一起失败

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v11111
QUEUED
127.0.0.1:6379(TX)> INCR name
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range

5. watch 监控

  1. 悲观锁 ( Pessimistic Lock ) , 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。

  2. 乐观锁 ( Optimistic Lock ) , 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。

    1. 乐观锁策略:提交版本必须   >   记录当前版本才能执行更新

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> watch k1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v2 

-- 如果现在有其他redis服务器修改了k1的值
-- 那么 exec 之后会返回 nil

6. unwatch

-- 如果知道了某个key在其他客户端发送了变化,可以供货unwatch取消监控
unwatch k1

一旦执行了 exec 之前加的监控锁都会被取消掉

当客户端连接丢失的时候 ( 比如退出链接 ) ,所有东西都会被取消监视

0

评论区