redis事务与ACID

ACID是数据库事务的四个关键特征

  • Atomicity(原子性): 一个事务中的命令要么一起被执行,要么一起都不被执行
  • Concistency(一致性): 在事务开始与结束的数据状态一致。举个例子就是在事务开始之前转入转出的钱总和要与事务结束之后保持一致
  • Isolation(隔离性): 一个事务中的中间状态应该是对其他事务不可见的。比如隔离级别读未提交明显就是看到了其他事务中间状态了
  • Durablity(持久性): 一个事务结束之后,改变应该持久化了。

原子性

在实际执行之前存在命令报错,那么会记录下该错误,在提交的时候拒绝,所以原子能保证

在实际执行报错,那么虽然会对报错的那条命令报错无法执行,可是其他命令却会得到执行,这就没有保证原子性

一致性

在事务执行过程中有命令入队、实际执行两个过程

  • 命令入队过程中,若出现错误会直接放弃执行,那么可以保证一致性
  • 实际执行时
    • 若是发生执行错误,那么正确的指令可以执行,也可以保证一致性
    • 可若是出现宕机,那么就要看数据是如何恢复的,对于RDB,RDB根本不会储存事务执行时的数据,事务更改都没了也保证了一致性。AOF要是只储存了一部分,那就有可能会无法保证一致性

隔离性

redis提供了watch机制来保证事务与非事务间的数据不可见。事务间的隔离性由于事务是提交之后直接执行的,所以也没什么中间状态

watch机制

watch是为redis事务提供的CAS(check and set)。也就是说在事务完成(无论是放弃还是提交)都会结束所有watch

若发现watch的key在事务提交之前被修改,那么整个事务将会被放弃

# client A
set wt 1

# client B
watch wt
multi
set wt 2
# 在clientA修改wt为1之后,clientB提交事务会返回nil
exec

持久性

显然,没有开启AOF、RDB是绝对无法满足持久性的

若采用RDB,在一个事务完成之后,RDB还未执行,那么如果宕机,那么此时事务持久性也无法保证

AOF也是同理,只是可能无法持久化的概率更低

Ref

  1. https://redis.io/docs/manual/transactions/

你可能感兴趣的:(db,redis)