苏州做网站公司有哪些,京东网站的建设与发展现状分析,酒店怎样做网站好评,网站后台上传表格ACID特性无需多言。我们知道关系数据库比如mysql可以实现事务的ACID特性#xff0c;begin,commit,回滚实现。 那么redis可以实现ACID吗#xff0c;结论是不能完全保证。
首先要知道redis通过MULTI关键字开启事务#xff0c;中间一系列操作#xff0c;加到操作队列中并不执…ACID特性无需多言。我们知道关系数据库比如mysql可以实现事务的ACID特性begin,commit,回滚实现。 那么redis可以实现ACID吗结论是不能完全保证。
首先要知道redis通过MULTI关键字开启事务中间一系列操作加到操作队列中并不执行。然后通过EXEC提交事务真正执行命令。
原子性分析 如果中间操作发生错误原子性可以保证吗分三种情况看。 第一种情况是在执行EXEC命令前客户端发送的操作命令本身就有错误比如语法错误使用了不存在的命令在命令入队时就被Redis实例判断出来了。这种整个事务会放弃执行可以保证原子性。 第二种事务操作入队时命令和操作的数据类型不匹配但Redis实例没有检查出错误。但是在执行完EXEC命令以后Redis实际执行这些事务操作时就会报错。不过需要注意的是虽然Redis会对错误命令报错但还是会把正确的命令执行完。在这种情况下事务的原子性就无法得到保证了。redis并没有回滚机制。
第三种情况在**执行事务的EXEC命令时Redis实例发生了故障导致事务执行失败。**在这种情况下如果Redis开启了AOF日志那么只会有部分的事务操作被记录到AOF日志中。我们需要使用redis-check-aof工具检查AOF日志文件这个工具可以把已完成的事务操作从AOF文件中去除。
一致性是可以保证的。
再看隔离性。隔离包括读未提交B可以读到A没有提交的数据出现脏读读的数据是旧数据不存在的数据很严重读已提交/不可重复读B只能读A已经提交的数据但是事务A多次读取同一数据如果中间B修改了数据并提交A多次读取的数据不一致 可重复读多次读取数据一致但是会出现幻读就是第一次读取数据不存在但是准备insert时发现数据一斤存在无法插入为什么会这样因为中间可能B插入了该条数据但是A读取的仍然是开始的视图依然没有记录为了保证可重复读具体二者MVCC机制不展开说了 最强的就是串行化可以一起读但是只能一个写mysql默认的是可重复读。 对于redis,如果并发操作在EXEC前面那么用watch机制可以保证隔离性WATCH如果观察变量变化了就不执行命令。如果并发是在EXEC后面那么由于redis是单线程的隔离性肯定能保证。
持久性肯定是不行的。如果Redis没有使用RDB或AOF那么事务的持久化属性肯定得不到保证。如果Redis使用了RDB模式那么在一个事务执行后而下一次的RDB快照还未执行前如果发生了实例宕机这种情况下事务修改的数据也是不能保证持久化的。 如果Redis采用了AOF模式因为AOF模式的三种配置选项no、everysec和always都会存在数据丢失的情况所以事务的持久性属性也还是得不到保证。
所以综上。ACID特性 对于原子性如果命令没错但是操作类型对不上比如string类型POPEXEC后执行某个命令才出错原子性不能保证没有回滚机制的。如果在EXEC之前就发现错误这些都不会执行。
对于一致性可以保证的。
对于隔离性如果并发操作在EXEC之前用WATCH可以保证并发在EXEC后面由redis单线程执行命令天然就能保证。
对于持久性不能保证因为AOF,RDB落盘前redis崩溃无法恢复。