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

在一样平常开发中,尤其是营业开发,少不了行使 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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值