一: 事务
数据库事务 : 在一次会话中的所有 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 对于错误有两种处理方式
语法编译都不通过 : exec 执行无法通过 , 例如:
gett
Redis 直接返回错误 , 所有的命令都不执行语法没问题但是执行出错 , 例如:
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 监控
悲观锁 ( Pessimistic Lock ) , 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。
乐观锁 ( Optimistic Lock ) , 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。
乐观锁策略:提交版本必须 > 记录当前版本才能执行更新
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 之前加的监控锁都会被取消掉
当客户端连接丢失的时候 ( 比如退出链接 ) ,所有东西都会被取消监视
评论区