关键词:
参考技术A 1、前言面试官:我看你简历上写了熟悉redis,看来工作中用的很多吧?
我:是的,我们项目中经常用到redis(来,随便问,看我分分钟秒杀你)
面试官:那你给我说说redis的事务和mysql的事务有什么区别吧
我:额。。。事务还有区别????
面试官:比如说redis的事务是不支持原子性和持久性的,包括他们的实现原理等方面也是有很大区别的。
我:学到了。。。。。。
2、正文
事务的四大特性
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
说的是一个事物内所有操作就是最小的一个操作单元,要么全部成功,要么全部失败。这是最基本的特性,保证了因为一些其他因素导致数据库异常,或者宕机。
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
一致性有下面特点:
在现实中,事务系统遭遇并发请求时,这种串行化是有成本的, Amdahl法则描述如下:它是描述序列串行执行和并发之间的关系。
“一个程序在并行计算情况下使用多个处理器所能提升的速度是由这个程序中串行执行部分的时间决定的。”
大多数数据库管理系统选择(默认情况下)是放宽一致性,以达到更好的并发性。
事物的隔离性,基于原子性和一致性,因为事物是原子化,量子化的,所以,事物可以有多个原子包的形式并发执行,但是,每个事物互不干扰。
但是,由于多个事物可能操作同一个资源,不同的事物为了保证隔离性,会有很多锁方案,当然这是数据库的实现,他们怎么实现的,我们不必深究。
持久性,当一个事物提交之后,数据库状态永远的发生了改变,即这个事物只要提交了,哪怕提交后宕机,他也确确实实的提交了,不会出现因为刚刚宕机了而让提交不生效,是要事物提交,他就像洗不掉的纹身,永远的固化了,除非你毁了硬盘。
事务命令
mysql:
Begin:显式的开启一个事务
Commit:提交事务,将对数据库进行的所有的修改变成永久性
Rollback:结束用户的事务,并撤销现在正在进行的未提交的修改
redis:
Multi:标记事务的开始
Exec:执行事务的commands队列
Discard:结束事务,并清除commands队列
默认状态
mysql:
mysql会默认开启一个事务,且缺省设置是自动提交,即每成功执行sql,一个事务就会马上commit,所以不能rollback,
redis:
redis默认不会开启事务,即command会立即执行,而不会排队,并不支持rollback
使用方式
mysql(包含两种方式):
用Begin、Rollback、commit显式开启并控制一个 新的 Transaction
执行命令 set autocommit=0,用来禁止当前会话自动commit,控制 默认开启的事务
redis:
用multi、exec、discard,显式开启并控制一个Transaction。
(注意:这里没有强调 “新的” ,因为默认是不会开启事务的)。
实现原理
mysql:
mysql实现事务,是基于undo/redo日志
undo记录修改前状态,rollback基于undo日志实现
redo记录修改后的状态,commit基于redo日志实现
既然是基于redo日志实现记录修改后的状态,那么大家应该也知道,redo日志是innodb专有的,所以innodb会支持事务
在mysql中无论是否开启事务,sql都会被立即执行并返回执行结果,只是事务开启后执行后的状态只是记录在redo日志,执行commit之后,数据才会被写入磁盘
(以上内容后面我会详细在mysql篇给大家讲到,大家可以先简单了解下)
所以,上述代码,insertSelective 将会被立即赋值(无论是否开启事务,只是结果或未被写入磁盘):
redis:
redis实现事务,是基于commands队列
如果没有开启事务,command将会被立即执行并返回执行结果,并且直接写入磁盘
如果事务开启,command不会被立即执行,而是排入队列,并返回排队状态(具体依赖于客户端(例如:spring-data-redis)自身实现)。
调用exec才会执行commands队列
以上代码如果没有开启事务,操作被立即执行,a将会被立即赋值(true/false)
如果开启事务,操作不会被立即执行,将会返回null值,而a的类型是boolean,所以将会抛出异常:
Redis事务不支持Rollback(重点)
事实上Redis命令在事务执行时可能会失败,但仍会继续执行剩余命令而不是Rollback(事务回滚)。如果你使用过关系数据库,这种情况可能会让你感到很奇怪。然而针对这种情况具备很好的解释:
redis 事务中的错误
事务期间,可能会遇到两种命令错误:
客户端会在EXEC调用之前检测第一种错误。 通过检查排队命令的状态回复(***注意:这里是指排队的状态回复,而不是执行结果***),如果命令使用QUEUED进行响应,则它已正确排队,否则Redis将返回错误。如果排队命令时发生错误,大多数客户端将中止该事务并清除命令队列。然而:
这是由于INCR命令的语法错误,将在调用EXEC之前被检测出来,并终止事务(version2.6.5+)。
EXEC命令执行之后发生的错误并不会被特殊对待:即使事务中的某些命令执行失败,其他命令仍会被正常执行。
面试官问我mysql索引,我真的是
面试官:我看你简历上写了MySQL,对MySQLInnoDB引擎的索引了解吗?候选者:嗯啊,使用索引可以加快查询速度,其实上就是将无序的数据变成有序(有序就能加快检索速度)候选者:在InnoDB引擎... 查看详情
使用canal解决mysql和redis数据同步(tcp)(代码片段)
...xff0c;该篇文章是基于TCP方式来实现。工作原理分析我们在面试的时候常常听面试官问这么一个问题:你们的Mysql和Redis怎么做数据同步的 查看详情
使用canal解决mysql和redis数据同步(tcp)(代码片段)
...xff0c;该篇文章是基于TCP方式来实现。工作原理分析我们在面试的时候常常听面试官问这么一个问题:你们的Mysql和Redis怎么做数据同步的 查看详情
redis的事务和watch
redis的事务严格意义来讲,redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的。redis中的事务定义Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,... 查看详情
redis面试题
redis和memcached比较?redis中数据库默认是多少个db及作用?python操作redis的模块?如果redis中的某个列表中的数据量非常大,如果实现循环显示每一个值?redis如何实现主从复制?以及数据同步机制?redis中的sentinel的作用?如何实... 查看详情
面试官问我map接口,我
面试官:今天来讲讲Map吧,你对Map了解多少?就讲JDK1.8就好咯候选者:Map在Java里边是一个接口,常见的实现类有HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap候选者:在Java里边,哈希表的结构是数组+链... 查看详情
面试官问我list接口,我
面试官:要不今天来讲讲Java的List吧,你对List了解多少?候选者:List在Java里边是一个接口,常见的实现类有ArrayList和LinkedList,在开发中用得最多的是ArrayList候选者:ArrayList的底层数据结构是数组,... 查看详情
js面试题面试官问我:遍历一个数组用for和foreach哪个更快?(代码片段)
还在担心面试不通过吗?给大家推荐一个超级好用的刷面试题神器:牛客网,里面涵盖了各个领域的面试题库,还有大厂真题哦!赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。... 查看详情
面试官:redis的事务满足原子性吗?(代码片段)
谈起数据库的事务来,估计很多同学的第一反应都是ACID,而排在ACID中首位的A原子性,要求一个事务中的所有操作,要么全部完成,要么全部不完成。熟悉redis的同学肯定知道,在redis中也存在事务,那... 查看详情
面试官问我tcp三次握手和四次挥手,我真的是
候选者:面试官你好,请问面试可以开始了吗面试官:嗯,开始吧面试官:今天来聊聊TCP吧,TCP的各个状态还有印象吗?候选者:还有些许印象的,要不我就来简单说下TCP的三次握手和四次挥手... 查看详情
面试官问我tcp三次握手和四次挥手,我真的是
候选者:面试官你好,请问面试可以开始了吗面试官:嗯,开始吧面试官:今天来聊聊TCP吧,TCP的各个状态还有印象吗?候选者:还有些许印象的,要不我就来简单说下TCP的三次握手和四次挥手... 查看详情
美女面试官问我:同步屏障和异步消息的运行机制(代码片段)
...小安】关注还在移动开发领域苟活的大龄程序员,“面试系列”文章将在公众号同步发布。1.前言通过昨天的技术交流,天才少年成功闯过一关,来到二面现场。2.正文哎呀,怎么面试官跟昨天的是同一个人,... 查看详情
美女面试官问我:同步屏障和异步消息的运行机制(代码片段)
...小安】关注还在移动开发领域苟活的大龄程序员,“面试系列”文章将在公众号同步发布。1.前言通过昨天的技术交流,天才少年成功闯过一关,来到二面现场。2.正文哎呀,怎么面试官跟昨天的是同一个人,... 查看详情
面试官问我谈谈对事务隔离机制的理解?我是这样回答的(代码片段)
一、简介事务隔离,是每场高级开发面试过程中,必不可少的一个环节,记得有一次面试某公司,面试官当场提出这个问题,因为没有充足的准备,所以结果可想而知!今天我们就一起来捋一捋关于事... 查看详情
面试官问:如何优化高并发相关的业务,你能回答的上来吗?
各位小伙伴面试的时候,经常会碰到面试官问一些高并发相关的业务场景,这篇文章帮助进入开发行业不久的程序猿了解如何简单实现抢购相关的业务流程,帮助大家梳理下思路。下面以CRMEB开源商城为例,了解下秒杀活动的创... 查看详情
面试:阿里面试官问我设计模式——代理模式,我是这样回答的!(代码片段)
1.什么是代理模式?为对象提供一种代理以控制对这个对象的访问。代理模式相当于:中介或者经纪人,代理类可以在被代理类的基础之上增加功能(扩展功能),比如日志记录和权限控制,这样被代理类隐藏起来了,比较安全... 查看详情
面试:阿里面试官问我设计模式——代理模式,我是这样回答的!(代码片段)
1.什么是代理模式?为对象提供一种代理以控制对这个对象的访问。代理模式相当于:中介或者经纪人,代理类可以在被代理类的基础之上增加功能(扩展功能),比如日志记录和权限控制,这样被代理类隐藏起来了,比较安全... 查看详情
redis常见的面试题及答案
1、什么是Redis?2、Redis相比memcached有哪些优势?3、Redis支持哪几种数据类型?4、Redis主要消耗什么物理资源?5、Redis的全称是什么?6、Redis有哪几种数据淘汰策略?7、Redis官方为什么不提供Windows版本?8、一个字符串类型的值能... 查看详情