前言

介绍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. SSH原理与实践(一)

    主页 个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ 引言 在日常开发和运维中,我们时常需要通过SSH登录远程主机,进行一些 ...

  2. axios post xml data方法

    axios#request(config) axios#get(url[,config]) axios#delete(url[,config]) axios#head(url[,config]) ax ...

  3. 探究WPF中文字模糊的问题:TextOptions的用法

    有网友问WPF中一些文字模糊是什么问题.之前我也没有认真思考过这个问题,只是大概知道和WPF的像素对齐(pixel snapping).抗锯齿(anti-aliasing)有关,通过设置附加属性Tex ...

  4. linux 服务器 执行命令挂起 nohup 改用 pm2

    nohup http-server -p 80 & nohup完要 exit 退出,不能直接关! nohup完要 exit 退出,不能直接关! nohup完要 exit 退出,不能直接关! 重 ...

  5. be动词 系动词 连缀动词 Linking Verb

    be动词 系动词 连缀动词 Linking Verb be 原型 am 第一人称单数形式 is 第三人称单数形式 are 第二人称单数和复数形式 been 过去分词 being 现在分词 was 第一 ...

  6. 基于stm32H730的解决方案开发之点亮第一个LED灯

    一 概述 STM32H730超值系列内含ArmCortex-M7内核(具有双精度浮点单元),工作频率可达550 MHz.内嵌的128 KB闪存使意法半导体能够为开发人员提供一种经济划算的解决方案.凭借 ...

  7. kettle教程--通过配置文件同步所需要的列数据

    kettle教程--通过配置文件同步所需要的列数据 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「kettle」, 免费领取全网最热的kettle实战视频教程 ht ...

  8. 使用gradle打包springboot项目

    这边整理下自己项目使用gradle打jar包的坎坷经历,使用的方式是命令行的方式 首先配置build.gradle跟我一样 plugins { id 'java' id 'org.springfram ...

  9. Python实践:基于Matplotlib实现某产品全年销量数据可视化

    本文分享自华为云社区<画图实战-Python实现某产品全年销量数据多种样式可视化>,作者:虫无涯. 学习心得 有时候我们需要对某些数据进行分析,得到一些可视化效果图,而这些效果图可以直观展 ...

  10. 天天用defineEmits宏函数,竟然不知道编译后是vue2的选项式API?

    前言 我们每天都在使用 defineEmits 宏函数,但是你知道defineEmits 宏函数经过编译后其实就是vue2的选项式API吗?通过回答下面两个问题,我将逐步为你揭秘defineEmits ...