在一样平常开发中,尤其是营业开发,少不了行使 Java 对数据库举行基本的增删改查等数据操作,这也是Java工程师的必备手艺之一。做好数据操作,不仅仅需要对Java语言相关框架的掌握,更需要对种种数据库自身系统结构的明白。今天这一讲,作为弥补Java面试考察知识点的完整性,关于数据库的应用和细节还需要在实践中深入学习。

今天我要问你的问题是,谈谈 MySQL 支持的事务隔离级别,以及消极锁和乐观锁的原理和应用场景?

典型回覆

所谓隔离级别(Isolation Level),就是在数据库事务中,为保证并发数据读写的正确性而提出的界说,它并不是MySQL专有的看法,而是源于ANSI/ISO制订的SQL-92尺度。

每种关系型数据库都提供了各自特色的隔离级别实现,虽然在通常的界说中是以锁为实现单元,但现实的实现千差万别。以最常见的 MySQL InnoDB 引擎为例,它是基于MVCC(Multi-Versioning Concurrency Control)和锁的复合实现,凭据隔离水平从低到高,MySQL事务隔离级别分为四个差别条理:

读未提交(Read uncommitted),就是一个事务能够看到其他事务尚未提交的修改,这是最低的隔离水平,允许脏读泛起。

读已提交(Read committed),事务能够看到的数据都是其他事务已经提交的修改,也就是保证不会看到任何中间性状态,固然脏读也不会泛起。读已提交仍然是对照低级其余隔离,并不保证再次读取时能够获取同样的数据,也就是允许其他事务并发修改数据,允许不可重复读和幻象读(Phantom Read)泛起。

可重复读(Repeatable reads),保证同一个事务中多次读取的数据是一致的,这是MySQL InnoDB引擎的默认隔离级别,然则和一些其他数据库实现差其余是,可以简朴以为MySQL在可重复读级别不会泛起幻象读。

串行化(Serializable),并发事务之间是串行化的,通常意味着读取需要获取共享读锁,更新需要获取排他写锁,若是SQL使用WHERE语句,还会获取区间锁(MySQL以GAP锁形式实现,可重复读级别中默认也会使用),这是最高的隔离级别。

至于消极锁和乐观锁,也并不是 MySQL 或者数据库中独占的看法,而是并发编程的基本看法。主要区别在于,操作共享数据时,“消极锁”即以为数据泛起冲突的可能性更大,而“乐观锁”则是以为大部门情形不会泛起冲突,进而决议是否接纳排他性措施。

反映到 MySQL 数据库应用开发中,消极锁一样平常就是行使类似SELECT … FOR UPDATE这样的语句,对数据加锁,制止其他事务意外修改数据。乐观锁则与Java并发包中的AtomicFieldUpdater类似,也是行使CAS机制,并不会对数据加锁,而是通过对比数据的时间戳或者版本号,来实现乐观锁需要的版本判断。

我以为前面提到的 MVCC,其本质就可以看作是种乐观锁机制,而排他性的读写锁、双阶段锁等则是消极锁的实现。

有关它们的应用场景,你可以构建一下简化的火车余票查询和购票系统。同时查询的人可能许多,虽然详细座位票只能是卖给一个人,但余票可能许多,而且也并不能展望哪个查询者会购票,这个时刻就更适合用乐观锁。

考点剖析

今天的问题来源于现实面试,这两部门问题反映了面试官试图考察面试者在一样平常应用开发中,是否学习或者思索过数据库内部的机制,是否领会并发相关的基础看法和实践。

我从通俗数据库应用开发者的角度,提供了一个相对简化的谜底,面试官很有可能进一步从实例的角度睁开,例如设计一个典型场景重现脏读、幻象读,或者从数据库设计的角度,可以用哪些手段制止类似情形。我建议你在准备面试时,可以在典型的数据库上试验一下,验证自己的看法。

其他可以考察的点也有许多,在准备这个问题时你也可以对比 Java 语言的并发机制,举行深入明白,例如,随着隔离级别从低到高,竞争性(Contention)逐渐增强,随之而来的价值同样是性能和扩展性的下降。

数据库衍生出许多差其余职责偏向:

数据库管理员(DBA),这是一个单独的专业领域。

数据库应用工程师,许多营业开发者就是这种定位,综合行使数据库和其他编程语言等手艺,开发营业应用。

数据库工程师,加倍侧重于开发数据库、数据库中间件等基础软件。

后面两者与 Java 开发加倍相关,然则需要的知识和手艺是差其余,以是面试的考察角度也有区别,今天我会剖析下对相关知识学习和准备面试的看法。

另外,在数据库相关领域,Java 工程师最常接触到的就是O/R Mapping框架或者类似的数据库交互类库,我会选取最普遍使用的框架举行对比和剖析。

知识扩展

首先,我来谈谈对数据库相关领域学习的看法,从最普遍的应用开发者角度,至少需要掌握:

数据库设计基础,包罗数据库设计中的几个基本范式,种种数据库的基础看法,例如表、视图、索引、外键、序列号天生器等,清晰若何将现实中营业实体和其依赖关系映射到数据库结构中,掌握典型实体数据应该使用什么样的数据库数据类型等。

每种数据库的设计和实现若干会存在差异,以是至少要醒目你使用过的数据库的设计要点。我今天开篇谈到的 MySQL 事务隔离级别,就区别于其他数据库,进一步领会MVCC、Locking等机制对于处置进阶问题异常有辅助;还需要领会,差别索引类型的使用,甚至是底层数据结构和算法等。

常见的 SQL 语句,掌握基础的SQL调优技巧,至少要领会基本思路是怎样的,例如SQL怎样写才气更好行使索引、知道若何剖析SQL执行计划等。

更进一步,至少需要领会针对高并发等特定场景中的解决方案,例如读写星散、分库分表,或者若何行使缓存机制等,现在的数据存储也远不止传统的关系型数据库了。

上面的示意图简朴总结了我对数据库领域的明白,希望可以给你举行准备时提供个借鉴。固然在准备面试时并不是一味找一堆书闷头苦读,我照样建议从现实工作中使用的数据库出发,侧重于连系实践,完善和深化自己的知识系统。

接下来我们照样回到 Java 自己,现在最为通用的Java和数据库交互手艺就是JDBC,最常见的开源框架基本都是构建在JDBC之上,包罗我们熟悉的JPA/Hibernate、MyBatis、Spring JDBC Template等,各自都有怪异的设计特点。

Hibernate 是最负盛名的O/R Mapping框架之一,它也是一个JPA Provider。顾名思义,它是以工具为中央的,其强项更体现在数据库到Java工具的映射,可以很方便地在Java工具层面体现外键约束等相对庞大的关系,提供了壮大的持久化功效。内部大量使用了Lazy-load等手艺提高效率。而且,为了屏障数据库的差异,降低维护开销,Hibernate提供了类SQL的HQL,可以自动天生某种数据库特定的SQL语句。

Hibernate 应用异常普遍,然则过分强调持久化和隔离数据库底层细节,也导致了许多坏处,例如HQL需要分外的学习,未必比深入学习SQL语言更高效;削弱程序员对SQL的直接控制,还可能导致其他价值,原本一句SQL的事情,可能被Hibernate天生几条,隐藏的内部细节也阻碍了进一步的优化。

而 MyBatis 虽然仍然提供了一些映射的功效,但加倍以SQL为中央,开发者可以侧重于SQL和存储历程,异常简朴、直接。若是我们的应用需要大量高性能的或者庞大的SELECT语句等,“半自动”的MyBatis就会比Hibernate加倍适用。

而 Spring JDBC Template 也是加倍接近于SQL层面,Spring自己也可以集成Hibernate等O/R Mapping框架。

关于这些详细开源框架的学习,我的建议是:

从整体上掌握主流框架的架构和设计理念,掌握主要流程,例如 SQL 剖析天生、SQL执行到效果映射等处置历程到底发生了什么。

掌握映射等部门的细节界说和原理,凭据我在准备专栏时整理的面试问题,发现许多问题都是偏向于映射界说的细节。

另外,对比差别框架的设计和实现,既有利于你加深明白,也是面试考察的热门偏向之一。

今天我从数据库应用开发者的角度,剖析了 MySQL 数据库的部门内部机制,而且弥补了我对数据库相关面试准备和知识学习的建议,最后对主流O/R Mapping等框架举行了简朴的对比。

原文链接:https://www.cnblogs.com/weigy/p/12702658.html

本站声明:网站内容来源于网络,若有侵权,请联系我们,我们将及时处置。

mysql 消极锁_MySQL支持的事物隔离级别以及消极锁和乐观锁原理和应用场景相关推荐

  1. mysql mvcc和行锁_mysql在RR的隔离级别下,究竟是通过MVCC解决幻读的还是通过行锁的next key算法解决的?...

    首先,我们需要搞懂几个隔离级别的意思和每个隔离级别会出现的问题.隔离级别分为:读未提交,读提交,可重复读和可串行化. 读未提交是最低级别的隔离级别,表示当一个事务还没有提交时,他所做的变更就被别的事务 ...

  2. mysql当时读_Mysql事务以及四中隔离级别实例2以及InnoDB如何解决当时读的幻读问题...

    接着上一篇笔记:http://blog.csdn.net/qq_33366229/article/details/78337354 第三级别(重复读): 第二种情况: 也就是基于上一种情况 事务A在事 ...

  3. mysql数据 锁 隔离级别_MySQL数据库事务各隔离级别加锁情况--read uncommitted篇

    1.目的 1.1 合适人群 1.数据库事务特征我只是背过,并没有很深刻的理解. 2.数据库事务的隔离级别只是了解,并没有深刻理解,也没有在实际工作中体验使用过. 3.经常面试被人问起数据库加锁情况,一 ...

  4. 数据库的四种事物隔离级别(基于MySQL的InnoDB存储引擎)

    准备工作 创建一个表,并插入几条基础数据 CREATE TABLE `transaction_isolation` (`id` bigint(10) NOT NULL AUTO_INCREMENT,` ...

  5. Mysql 8的四种隔离级别以及对应不同类型的锁

    文章目录 1. MySql 8的四个隔离级别 2. 不同类型的锁 3. 四个级别 对应的不同的锁 4. 如何测试每个隔离级别使用的什么锁? 5. 有关事务相关的文档内容总结 6. 什么情况下是行锁,什 ...

  6. SHOW VARIABLES LIKE “tx_isolation“查看mysql查看当前数据库的事物隔离级别

    SHOW VARIABLES LIKE "tx_isolation"查看mysql查看当前数据库的事物隔离级别

  7. MySQL数据库事物隔离级别

    mysql数据库的事物隔离级别主要有四种: Serializable 串行化,一个事物一个事物的执行 Repeatable read 可重复读 , 无论其他事物是否修改并提交了数据,在这个事物中看到的 ...

  8. Mysql事物隔离级别

    事物隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 是 是 是 不可重复读(read-ccommitted) 否 是 是 可重复读 (repeatable-read) ...

  9. 脏读、不可重复读 共享锁、悲观锁 和 事务五种隔离级别

    http://www.cnblogs.com/adforce/archive/2011/04/20/2021929.html 一.脏读.不可重复读.幻读 1.脏读:脏读就是指当一个事务正在访问数据,并 ...

最新文章

  1. Eclipse插件打开编辑器
  2. python中id3决策树算法_ID3决策树算法实现(Python版)
  3. 实现不是三角形尾巴的气泡框
  4. 关于eclipse的实用技巧
  5. 又是一年中秋节,好想举杯邀明月
  6. Html5不可见标签,及标签属性(元素对象属性) a href target name id 相对路径
  7. MyBatis-面试题
  8. 我是 LinkedIn 的 SRE ,我把 LinkedIn 搞挂了
  9. vue报错getVueAllUser:67 Uncaught TypeError: Cannot read property 'userId' of undefined
  10. C#之四十二 C# 读写文本文件乱码解决方案
  11. 分享一套基于HTML5的网络拓扑图组件 Qunee下载
  12. QGIS制图:矢量数据制图流程及导出
  13. 1147 Heaps (30 分)
  14. Android Weekly #33 :这个世界的问题,在于聪明人充满疑惑,而傻子们坚信不疑
  15. 【火爆全网的抖音无人直播项目:挤地铁源代码】
  16. 软件测试工程师,未来十年的职业规划~
  17. 为了提高python代码运行速度和进行_一行代码让你的python运行速度提高100倍
  18. 经典进程同步问题——吸烟者问题
  19. easyui datagrid 多列checkbox
  20. ThinkCMF知识点汇总

热门文章

  1. UG NX 12 点构造器
  2. 百万奖补!2022年湖北省双创战略团队申报条件、材料和支持奖补
  3. 【哈夫曼树】JZOJ_4210 我才不是萝莉控呢
  4. 2019.1.21【NOIP提高组】模拟B组 JZOJ 4210 我才不是萝莉控呢
  5. LayaAir使用总结
  6. thinkphp设计模式讲解
  7. 图像隐写术分析论文笔记:Deep learning for steganalysis via convolutional neural networks
  8. 足迹推荐位,淘宝足迹推荐位,旺旺打标足迹显示问题,详情页足迹推荐,淘宝详情页的下拉出现足迹,v兔电商
  9. 医学统计学和计算机等级,医学统计学计算机操作教程
  10. 【NOIP2014】飞扬的小鸟 背包dp