请选择
进入手机版
|
继续访问电脑版
首页
Portal
资讯
社区
BBS
登录
/
注册
用户名
Email
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
本版
文章
帖子
用户
本版
文章
帖子
用户
道具
勋章
任务
门户
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
社区
›
数据库
›
redis┃面试官问我redis事务和mysql事务的区别,我 ...
redis┃面试官问我redis事务和mysql事务的区别,我
[ 复制链接 ]
猿梦
2022-12-30 11:05:33
老子朋友们不行*亲你跑进来,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命令执行之后发生的错误并不会被特殊对待:即使事务中的某些命令执行失败,其他命令仍会被正常执行。
相关帖子
redis和mysql区别,1、偶redis和mysql区别曹代丝很%数据库老师会问哪些
数据多的时候为什么要使用redis而不用mysql?
redis是关系型数据库吗
mysql读写分离和用Redis做缓存,这两种方案有什么异同
redis和mysql区别#同样的请求量如果打到MySQL上
redis和mysql区别&提交事务时当queue 中有语法错误语句会discard 整个
redis和mysql区别^Redis处理完业务逻辑之后
MySQL与Redis数据库连接池介绍(图示+源码+代码演示)
Redis-Redis可以作为一个数据库使用吗
redis和mysql区别*本文介绍MySQL与Redis缓存的同步的两种方案
回复
使用道具
举报
相关文章
navicat for 激活码?系统上的部分程序进行
navicat for 激活码?常见的SQL面试题:经典
mybatis原理‘至此Spring成功对接MyBatis
mybatis原理^深入剖析mybatis原理(二)
mybatis原理!《深入理解mybatis原理》 Myb
navicat for 激活码$里面也可能保存的有密
黑马程序员全套视频,就是在北化工大学里的
怎么学会python库
一文看尽2018全年AI技术大突破:NLP跨过分
python自学看什么书,以及2、门python自学看
navicat for 激活码?系统上的部分程序进行
navicat for 激活码?常见的SQL面试题:经典
mybatis原理‘至此Spring成功对接MyBatis
mybatis原理^深入剖析mybatis原理(二)
mybatis原理!《深入理解mybatis原理》 Myb
navicat for 激活码$里面也可能保存的有密
黑马程序员全套视频,就是在北化工大学里的
怎么学会python库
一文看尽2018全年AI技术大突破:NLP跨过分
python自学看什么书,以及2、门python自学看
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖后跳转到最后一页
发帖
猿梦
2022-12-30 11:05:33
关注
0
粉丝关注
133901
主题发布
板块介绍填写区域,请于后台编辑
最新文章
navicat for 激活码?系统上的部分程序进行
navicat for 激活码?常见的SQL面试题:经典
mybatis原理‘至此Spring成功对接MyBatis
mybatis原理^深入剖析mybatis原理(二)
mybatis原理!《深入理解mybatis原理》 Myb
navicat for 激活码$里面也可能保存的有密
黑马程序员全套视频,就是在北化工大学里的
怎么学会python库
一文看尽2018全年AI技术大突破:NLP跨过分
python自学看什么书,以及2、门python自学看
热门板块
Python
Java
C/C++
前端
数据库
移动
AI
区块链
物联网
运维