redis之事务

事务(是由一系列对系统中数据进行访问与更新的操作所组成的一个程序 执行逻辑单元。

redis是具备事务的,与关系型数据库不同的是redis的开始事务是multi,执行事务为exec,取消事务discard,以及可以对key进行监视的watch以及取消监视所有key的unwatch。

目录

redis与ACID

原子性(Atomicity):事务中的操作不可以再分,操作要么全部执行,要么全部不执行。

2.一致性(Consistency):事务前后数据的完整性必须保持一致。

3.隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

4.持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

watch指令:

总结:


redis与ACID

谈到事务一般都是ACID,来看看redis的事务具不具备ACID的全部特性。

 

  1. 原子性(Atomicity):事务中的操作不可以再分,操作要么全部执行,要么全部不执行。

首先redis是单线程的,所以redis的单条命令是原子性执行的,但事务不保证原子性,且没有回滚。当redis的事务执行过程中,出现有命令执行失败,只会忽略命令失败,但是其他命令并不会回滚,会继续进行,所以redis的事务是不确保原子性的,但是redis的单条命令执行是原子性的。像关系型数据库如果要实现原子性,会有回滚日志,当事务执行中命令报错时,通过回滚日志将数据进行恢复到事务开启之时。

  •  如果是命令执行错误,那么redis会忽略掉命令错误操作,其余操作继续进行redis之事务_第1张图片
  • 如果是指令操作错误,则事务中全部命令都不执行

redis之事务_第2张图片

2.一致性(Consistency):事务前后数据的完整性必须保持一致。

根据redis的事务不支持原子性,所以redis的事务中是命令执行错误,那么redis会忽略掉命令错误操作,其余操作继续进行,并不会回滚,从而数据不是从一个完整的状态到另外一个完整的状态,并不具备完整性。

 

3.隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

因为redis是单线程的,所以事务的执行都是按顺序执行,所以隔离性是具备的。

 

4.持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

redis的持久性得看redis的持久化模式,假设你并没有设置任何持久化模式,只使用内存,那么宕机后数据将一切情况,才用rdb模式,备份的是在某个时间点的全部数据,aof模式只有将 appendfsync 设置为 always,程序才会在执行命令同步保存到磁盘,这个模式下,Redis 具备持久化。

 

所以redis的事务跟关系型数据库的事务的并不一样,redis的设计是为了简单高效,并没有考虑太多的事务特性。

 

watch指令:

Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断,watch提供了一种类似乐观锁的机制实现并发修改的方式。先监控一个对象,只要在事务执行之前,没有被改动,则提交事务,否则事务将被打断,不执行。

redis之事务_第3张图片

总结:

    redis的设计是为了简单高效,并没考虑太多的事务的特性,redis是单线程的,所以命令具有原子性,但是事务并不具备,因为redis设计并没有考虑回滚,所以并不是出现命令错误将命令全部不执行,redis也不具备一致性,但是单线程的redis与生俱来就拥有隔离性,事务之间的执行都是按照事务执行顺序一个个执行,持久化得看redis采用的持久化的模式是怎样,watch的命令提供了一种并发修改的乐观锁的机制。

 

 

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