前言

介绍mysql 锁的机制。

正文

锁类型

读锁,是一种共享锁,s锁,允许一个事务是读取一行,阻止其他事务获取相同的数据集的排他锁。

注:排它锁的意思就是说只能加相同的锁,不能加不同的锁,比如都加共享锁,也就是说大家可以都读取。

假如事务A对数据项Z进行s锁,那么事务B只能添加s锁,而不能添加互斥锁,也就是X锁。这保证了,其他事务可以读取Z,

但是在A的S锁释放之前,是不能进行任何修改的。

写锁,是互斥锁的一种,x锁。允许获取排它锁的事务更新数据,阻止其他事务取得相同的数据及共享读锁和排它写锁。

也就是说,加入事务A对数据项Z加了写锁,那么会产生一个效果,那就是其他事务就不能对该数据加任何锁了,这个时候

A可以对数据项Z进行读取和修改。

锁对象

这里介绍锁对象。

表锁:一次性对一张表整体加锁,是mysql中最大颗粒度的锁定机制。

MylSAM 存储引擎就是使用表锁,开销小、实现逻辑非常简单,带来的系统负面影响小,加锁和释放锁快,无死锁,但是锁范围大,容易发生锁冲突,并发最低。

行锁:一次性对一条数据加锁,锁定对象的颗粒度小。也就是我们常用的innodb可以用到行锁,开销大,加锁慢,容易出现死锁;锁的范围较小,不易发生锁冲突,并发高。

页面锁:锁定颗粒介于表锁和行锁之间;开销和加锁时间介于表锁和行锁之间。会出现死锁;并发度一般。

具体使用哪种引擎,哪种级别的锁,还是要看业务的,一般来说需要高并发的一般都是用innodb。

innodb

事务

为什么提及到这个innodb东西呢?是因为,俺只用到这东西,其他只是在理解层面上。

innodb 在锁的概念上两个特征,一个是支持事务,第二个就是行锁。

为什么说出这两个特征,前面提及过一个问题,就是说行锁有几个问题,开销发,加锁慢,容易出现死锁。

这里再次介绍事务的ACID。

原子性(actomicity),事务是一个操作单元对数据修改要不全部执行,要不就是全不执行。

一致性(Consistent),在事务开始和完成的时候,数据必须保持一致状态。

隔离性(lsolation),数据库系统提供一定的隔离机制,保证事务在不受外部并发影响的独立环境执行。

持久性(durable),事务完成之后,他对于数据的修改是永久性的,即使出现系统故障也能够保持。

同样的,因为事务需要保持着这几种特性,才能说是一个合格的事务。

因为事务的并发,然后又是行锁,那么就会产生一系列并发问题。

假设在不采用锁措施的情况下:

1.脏读:一个事务正在对一条数据做修改,在这个事务提交前。这时候另外一个事务也用来读取该条数据,这个时候就是读取了未提交的数据了。

2.不可重复读:一个事务在读取某些数据已经发生了改变,或某些记录已经被删除了。其实就是两次读取不一致。

是这样的,事务可以看成一系列事件的执行,比如说事件A进行读取数据Z,然后其他事务对数据Z进行写操作,那么A后面一个事件B也是读取操作,这个时候B读取到的数据和A读取到的数据不一致。

所以这个就叫做不可重复读,其实就是事务的隔离性被破坏。

幻读:一个事务两次的查询条件重新读取以前的数据已经发生数量的改变。比如说同一个事务T, A事件 读取到的数据是10条,然后事务B进行了增加一条,那么问题来了,事务B执行相同条件的查询的时候就出现了问题。

更新丢失:这个很好理解了,如果理解了脏读的话,这个就更好理解了,是这样子的,如果两个事务,同时对一条数据进行修改,然后分不同时候提交,那么肯定有一个是没有保存。

事务隔离

通过事务的隔离,来解决一些问题,但是呢,也要权衡利弊,为啥这么说呢?加锁肯定降低性能的。

1.读未提交:

就是不加锁,上面的问题就是因为不加锁导致的,所以说,you know。

2.读已提交

就是说事务只能读取到其他事务提交后的东西,写锁。

这个东西可以解决脏读,为什么这么说呢?因为脏读不就是读取没有提交的数据。

但是不可重复读还是会发生,是这样的,不可重复读是因为一个事务的事件中间穿插了其他事务的写事件。

3.可重复读

事务不会读到其他事务对已有数据的修改,及时其他事务已提交,也就是说,事务开始时读到的已有数据是什么,在事务提交前的任意时刻,这些数据的值都是一样的。

幻读问题依然存在。

4.串行化

这个不并发自然不产生问题。

该节为简单介绍,后续为悲观和乐观锁。

mysql 锁机制(一)的更多相关文章

  1. Mysql锁机制介绍

    Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  2. Mysql锁机制--索引失效导致行锁变表锁

    Mysql 系列文章主页 =============== Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~ 在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不 ...

  3. mysql锁机制详解

    前言 大概几个月之前项目中用到事务,需要保证数据的强一致性,期间也用到了mysql的锁,但当时对mysql的锁机制只是管中窥豹,所以本文打算总结一下mysql的锁机制. 本文主要论述关于mysql锁机 ...

  4. 对mysql锁机制的学习

    1.对于mysql学习,经常翻看一些博客,论坛,好像或多或少有mysq锁机制的学习与总结,所以今天有必要 对mysql锁机制的一些个人的总结,以便以后深入的学习. 2.学习这件事,从来都是“深入浅出” ...

  5. mysql锁机制(转载)

    锁是计算机协调多个进程或线程并发访问某一资源的机制 .在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所 ...

  6. 再谈mysql锁机制及原理—锁的诠释

    加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...

  7. mysql锁机制和事务隔离

    mysql事务 1.InnoDB事务原理 事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致性状态转换为另一种一致性状态. 在数据库提交时,可以确保要么所有修 ...

  8. mysql锁机制 读书笔记

    目录 MySQL锁机制 1.什么是锁 2.lock与latch 3.InnoDB存储引擎中的锁 3.1锁的类型 3.2 一致性非锁定读 3.3 一致性锁定读 4 锁的算法 4.1行锁的3中算法 4.2 ...

  9. (三)MySQL锁机制 + 事务

    转: (三)MySQL锁机制 + 事务 表锁(偏读) 偏向MyISAM存储引擎.开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发最低. 查看当前数据库中表的上锁情况,0表示未上锁. sh ...

  10. MySQL锁机制总结(二)

    前言: Mysql是一个支持插件式存储引擎的数据库系统,本文讨论的锁机制也主要包含两部分SERVER层的锁和存储引擎的锁,存储引擎是指innodb,其它存储引暂不讨论. 1. 数据库中锁相关的基本概念 ...

随机推荐

  1. spring源码手写aop

    AOP:       aop切面编程,其实就是spring增强器的一个扩展,就是通过beanPostProcessor的after后置方式实现的,其中在after中把需要的bean通过放射+动态代理完 ...

  2. jenkins配置从git指定分支下载代码,打包部署jar包

    1.如何构造一个jenkins部署? 1.1 目标 从git上指定分支下载代码,打包并发布到指定机器上,启动. 1.2 实现 如果已有项目,直接copy一份配置即可,修改一下即可使用 如果没有配置好的 ...

  3. 【mac】Alfred 无法调用Terminal

    原因:是从mac app商店安装的Alfred class 解决方案:建议从官网下载安装:https://www.alfredapp.com/ 参考:https://www.alfredforum.c ...

  4. pfx文件导出pem和私钥,更换网站域名证书

    openssl 路径: C:\Program Files\OpenSSL-Win64\bin -- 导出pem证书openssl pkcs12 -in C:\BackUp\Lightning\cert ...

  5. Uni-App 实现资讯滚动

    项目需要实现资讯的滚动,使用了Swiper组件,实现了首页头部的资讯滚动,简单地做下笔记 效果 实现说明 主要是使用了Swiper可以自动滚动的特性来实现,左边是一个图片,右边则是Swpier,且姜S ...

  6. docker如何以root身份登录

    有时候我们需要进入docker容器时以root身份进入,这边汇总了两种方式如下 第一种 docker exec -it --user=root container_id /bin/bash 第二种 d ...

  7. 一个简单的RTMP服务器实现 --- RTMP与FLV

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  8. 菜鸟角度简单分析BP算法(Error Back Propagation)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  9. 优雅的处理挂载window上的函数可能不存在的情况

    背景 在做一个Web JS SDK(A)时,内部会用到另一个Web JS SDK(B)的方法.(文中后续用A/B代替两者) B通常会提供Script和NPM包两种使用方式 使用npm pkg的缺点 增 ...

  10. 用Vue3.0 写过组件吗?如果想实现一个 Modal你会怎么设计?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.组件设计 组件就是把图形.非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式 现在有一个场景,点击新增与编辑都弹框出来进行 ...