【Redis】事务

简单理解

Redis是单线程的,所以并Redis的每个命令必然是原子性的。所以,Redis事务的实现非常简单:开启事务后,之后的命令都不会立即执行,而是放到一个队列中,之后一声令下开始顺序执行。

 
 

ACID

根据官网文档,Redis事务支持ACI(原子性、一致性、隔离性),但不一定支持D(持久型)。当持久化方式是AOF且配置为appendfsync always时,才能保证持久性。

 
 

原语实现

Redis的事务通过 multi、exec、discard、watch 四个原语实现。

核心的思路是:multi命令开启事务,之后的命令都不会立即执行,而是放到一个事务队列中;当exec命令被调用时,队列中所有的命令才会开始顺序执行。另外,discard命令用于清空事务队列,watch命令用于开启CAS乐观锁。

▼ 事务的开启与执行

# 开启事务
127.0.0.1:6379> multi	
OK

# 操作入队
127.0.0.1:6379(TX)> set k 233	
QUEUED
# 操作入队
127.0.0.1:6379(TX)> incr k
QUEUED
# 操作入队
127.0.0.1:6379(TX)> set k 456
QUEUED

# 执行事务
127.0.0.1:6379(TX)> exec
1) OK
2) (integer) 234
3) OK

▼ 事务的放弃

# 开启事务
127.0.0.1:6379> multi
OK

# 操作入队
127.0.0.1:6379(TX)> set k 234
QUEUED
# 操作入队
127.0.0.1:6379(TX)> incr k
QUEUED

# 放弃事务
127.0.0.1:6379(TX)> discard
OK

▼ 开启CAS乐观锁

# 设置key-value
127.0.0.1:6379> set k 233
OK
# 开启CAS乐观锁
127.0.0.1:6379> watch k
OK
# 修改key-value
127.0.0.1:6379> incr k
(integer) 234

# 开启事务
127.0.0.1:6379> multi
OK
# 操作入队
127.0.0.1:6379(TX)> incr k
QUEUED

# 执行事务(失败)
127.0.0.1:6379(TX)> exec
(nil)

 
 

两种事务错误


入队错误

事务在exec执行之前,入队的命令发生错误。这种错误一般是能被立即发现的语法错误(比如参数数量错误)。

对于入队错误,在入队的时候就会对其进行记录,在真正exec的时候,会拒绝整个事务的执行!!!


执行错误

事务在exec执行过程中,才被发现的错误。这种错误一般是在运行的时候才能被发现的语法错误(比如在hash类型的键上使用了list的方法)。

对于执行错误,并不会进行回滚,而是自动跳过这些错误的操作,继续执行其他的操作!!!


这太奇怪了!为什么Redis不支持回滚呢?

根据官网的描述,Redis命令只会因为(入队时无法发现的)语法错误而失败,但是,语法错误是应该在开发时就被解决的,它们本不应该出现在生产环境中!另外,不支持回滚也使得Redis更加简单、快速、高效。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

☘️ 玩转Redis专题!

🍄 不来博客里瞧一瞧吗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值