mysql的事务是innodb存储引擎独有的,myisam存储引擎不支持事务。

事务最经典的例子就是转账了,事务要保证的是一组数据库的操作要么全部成功,要么全部失败。是为了保证高并发场景下数据的正确性而定义。

事务并非mysql独有。在mysql中,数据库的事务隔离采用的是MVCC结合锁来实现的。

我是李福春,今天的问题是,mysql是如何实现事务隔离的?在实际开发中应该如何正确的使用事务?

ACID特性

事务首先具备ACID特性,即

Atomic原子性,

Consistency一致性

Isolation隔离性

durability持久性;

事务隔离级别

事务的隔离级别有4个层级,隔离级别依次升高,并发性能依次降低;

读未提交:一个事务可以看到别的事务没有提交的数据,最低隔离水平,容易出现脏读问题;

读已提交:一个事务看到的都是别的事务已经提交过的数据,会出现不可重复度和幻读问题;

可重复度:一个事务的开始和结束阶段读取到的数据一致,mysql默认隔离级别,会出现幻读问题;

串行化:所有的语句都加锁,select读锁,更新操作写锁,where语句还会使用区间锁,最高的隔离级别;

mysql的默认隔离级别是可重复度,而oracle的默认隔离级别是读已提交。

查询mysql当前隔离级别的语句是: show variables like '%transaction%'

事务隔离原理

mysql实现事务隔离的原理是:

每条更新记录都会记录一条回滚操作,记录最新值,通过回滚操作,都可以得到前一个状态的值;

基于MVCC和锁,数据库的多版本并发控制实现;

如下图:

事务之间互不影响,但是回滚操作是共享的,某个事务回滚,根据版本号,拿到回滚操作,可以回滚到事务改变前的值;

长事务的避免和定位

实际的编程中,尽量不用长事务,因为:

1,长事务会产生很多的回滚操作日志,占用大量的空间;

2,长事务占用锁资源;

查看当前mysql服务器的长事务的sql语句:

select * from infomation_schema.innodb_trx where time_to_second(timediff(now(),trx_started))>60;

程序中如何合理的使用事务

1, set autocommit=1 ,然后显示的使用事务语句或者不使用事务;

2,使用事务的语句 begin transaction , commit ,rollback  ;

悲观锁

利用类似 select for update  对数据加锁,避免其他事物意外修改数据;

并发编程的基本概念,在操作共享数据的时候,悲观锁认为数据冲突的可能性比较大。

排它锁(读写锁,双阶段锁)是悲观锁;

乐观锁

在并发操作共享数据的时候,乐观锁认为数据出现冲突的可能性比较小。

MVCC本质上可以看成是乐观锁机制。

类似于java的 AtomicFieldLongUpdater  , 利用CAS机制,并不会对数据加锁,而是对比数据的时间戳或者版本号,需要皆准版本判断;

售票系统适合使用乐观锁;

小结

本节回答了mysql的事务隔离级别,隔离级别越高,并发性能越低;

以及mysql事务隔离的实现原理:基于MVCC和锁实现;

结合编程实践,介绍了悲观锁,乐观锁,并对比了java的并发编程中的工具;

最后给出了一个编程中推荐使用事务的方式。以及一个排查mysql的长事务的sql语句。

原创不易,点赞关注支持一下吧!转载请注明出处,让我们互通有无,共同进步,欢迎沟通交流。

我会持续分享Java软件编程知识和程序员发展职业之路,欢迎关注,我整理了这些年编程学习的各种资源,关注公众号‘李福春持续输出’,发送'学习资料'分享给你!

面试刷题29:mysql事务隔离实现原理?的更多相关文章

  1. 面试突击61:说一下MySQL事务隔离级别?

    MySQL 事务隔离级别是为了解决并发事务互相干扰的问题的,MySQL 事务隔离级别总共有以下 4 种: READ UNCOMMITTED:读未提交. READ COMMITTED:读已提交. REP ...

  2. [51CTO]新说MySQL事务隔离级别!

    新说MySQL事务隔离级别! 事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!本文所讲大部分内容,皆有官网作为佐证,因此对本文内 ...

  3. mysql事务隔离级别、脏读、幻读

    Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...

  4. 面试总结:关于MySQL事务的10个问题常见面试问答(FQA)

    学习关系型数据库MySQL是很好的切入点,大部分人工作中用惯了CRUD,对面试官刨根问底的灵魂拷问你还能对答如流吗?我们有必要了解一些更深层次的数据库基础原理. 文章每周持续更新,各位的「三连」是对我 ...

  5. 安利一个基于Spring Cloud 的面试刷题系统。面试、毕设、项目经验一网打尽

    推荐: 接近100K star 的Java学习/面试指南 Github 95k+点赞的Java面试/学习手册.pdf 今天给小伙伴们推荐一个朋友开源的面试刷题系统. 这篇文章我会从系统架构设计层面详解 ...

  6. 查询mysql事务隔离级别

    查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava   1.查看当前会话隔离 ...

  7. MySQL事务隔离级别测试实例

    https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...

  8. Mysql事务-隔离级别

    MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...

  9. MySQL事务隔离级别 解决并发问题

    MySQL事务隔离级别 1. 脏读: 骗钱的手段, 两个窗口或线程分别调用数据库转账表,转账后未提交,对方查看到账后,rollback,实际钱没转. 演示方法: mysql默认的事务隔离级别为repe ...

随机推荐

  1. Ⅱ:python入门

    一.编程语言介绍 编程语言的分类: 机器语言 汇编语言 高级语言(编译型.解释型号) 总结: 执行效率:机器语言>汇编语言>高级语言(编译型>解释型) 开发效率:机器语言<汇编 ...

  2. SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

  3. pip3 install mysqlclient安装失败

    报错信息: OSError: mysql_config not found 解决方法: 执行以下命令 yum install python-devel mysql-devel -y 然后再 pip3 ...

  4. DUBBO 面试灵魂18问

    一.Dubbo 是什么 dubbo 是一个分布式框架,是一个远程服务调用的分布式框架,其核心部分包含: 1)集群容错: 提供基于接口方法的透明远程过程调用,包含多协议支持,以及软负债均衡.失败容错.地 ...

  5. JavaScript的数组(一)

    在JavaScript中,对象,数组,函数是最最常用的东东了,写完了对象和函数,最后来说说数组吧,提到数组,就只能想到,map,forEach啊,pop,push啊,当真是没有一点点的积累了?这么多年 ...

  6. notepad++ 快捷键运行python程序目录存在空格的问题

    通常情况下 cmd /k (python.exe文件所在路径) "$(FULL_CURRENT_PATH)"&PAUSE&EXIT 就ok了,路径里有空格就不一样了 ...

  7. vue用template还是JSX?

    各自特点 template 模板语法(HTML的扩展) 数据绑定使用Mustache语法(双大括号) <span>{{title}}<span> JSX JavaScript的 ...

  8. 回想笔记 瞎比比 域名注册 解析绑定ip 下载证书 设置证书 重定向http到https请求

    2019.7.27 回想笔记 拥有腾讯云服务器一台 阿里云注册5元域名,进行备案 完成之后 使用解析 绑定服务器ip地址 ,使用域名可以访问到web服务器而不是通过直接暴露ip地址进行访问 证书购买 ...

  9. C语言程序设计(七) 函数

    第七章 函数 分而治之: 把较大的任务分解成若干较小.较简单的任务,并提炼出公用任务的方法 函数是C语言中模块化程序设计的最小单位,既可以把每个函数都看作一个模块,也可以将若干相关的函数合并成一个模块 ...

  10. 数据采集实战:通过Python获取和分析Google趋势中Covid-19的关注程度

    在传染病研究领域,社交媒体数据已被证明可作为预测感冒和流感季节的发作和进展的指标.在本文中,我们将使用Google Trends API来衡量与冠状病毒的状态.我们将使用python谷歌趋势API p ...