mysql 锁机制(一)
前言
介绍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 锁机制(一)的更多相关文章
- Mysql锁机制介绍
Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...
- Mysql锁机制--索引失效导致行锁变表锁
Mysql 系列文章主页 =============== Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~ 在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不 ...
- mysql锁机制详解
前言 大概几个月之前项目中用到事务,需要保证数据的强一致性,期间也用到了mysql的锁,但当时对mysql的锁机制只是管中窥豹,所以本文打算总结一下mysql的锁机制. 本文主要论述关于mysql锁机 ...
- 对mysql锁机制的学习
1.对于mysql学习,经常翻看一些博客,论坛,好像或多或少有mysq锁机制的学习与总结,所以今天有必要 对mysql锁机制的一些个人的总结,以便以后深入的学习. 2.学习这件事,从来都是“深入浅出” ...
- mysql锁机制(转载)
锁是计算机协调多个进程或线程并发访问某一资源的机制 .在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所 ...
- 再谈mysql锁机制及原理—锁的诠释
加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...
- mysql锁机制和事务隔离
mysql事务 1.InnoDB事务原理 事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致性状态转换为另一种一致性状态. 在数据库提交时,可以确保要么所有修 ...
- mysql锁机制 读书笔记
目录 MySQL锁机制 1.什么是锁 2.lock与latch 3.InnoDB存储引擎中的锁 3.1锁的类型 3.2 一致性非锁定读 3.3 一致性锁定读 4 锁的算法 4.1行锁的3中算法 4.2 ...
- (三)MySQL锁机制 + 事务
转: (三)MySQL锁机制 + 事务 表锁(偏读) 偏向MyISAM存储引擎.开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发最低. 查看当前数据库中表的上锁情况,0表示未上锁. sh ...
- MySQL锁机制总结(二)
前言: Mysql是一个支持插件式存储引擎的数据库系统,本文讨论的锁机制也主要包含两部分SERVER层的锁和存储引擎的锁,存储引擎是指innodb,其它存储引暂不讨论. 1. 数据库中锁相关的基本概念 ...
随机推荐
- Java 多态 案列
1 package com.bytezreo.duotai; 2 3 //多态性的使用 举例一 4 public class AnimalTest 5 { 6 public static void m ...
- Java 类方法的声明和使用
1 /** 2 * 3 * @Description 4 * @author Bytezero·zhenglei! Email:420498246@qq.com 5 * @version 6 * @d ...
- Pod的优先级(priorityClass)和抢占策略(preemptionPolicy)
Pod优先级 Pod优先级是一个用于指示Pod相对重要程度的整数值.优先级高的Pod在调度时会优先被考虑,并且在资源不足时,优先级较低的Pod可能会被驱逐以释放资源给优先级较高的Pod.Pod优先级的 ...
- Go | Gin 解决跨域问题跨域配置
Go | Gin 解决跨域问题跨域配置 目录 一.关于跨域解决方案 二.使用步骤 1. 编写一个中间件 2. 使用 3. 注意事项 一.关于跨域解决方案 关于跨域的解决方法,大部分可以分为 2 种 n ...
- 一种OSD 简单实现 (文字反色---opencv、字体切换---freetype2(中文、空格))
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- Hexo Next主题vercel页面NOT_FOUND
前端时间将博客部署到了Vercel上,使用的是Hexo Next主题.发现某些博文点进去以后会出现找不到的情况: 404: NOT_FOUND Code: NOT_FOUND ID: ... ... ...
- 使用现代身份验证(OAuth)来连接POP、IMAP或SMTP
我的博客园:https://www.cnblogs.com/CQman/ 转载: https://mp.weixin.qq.com/s?__biz=MzU0MzUxMzU2NA==&mid=2 ...
- HTML/ CSS 入门
前言 我们在之前的学习中,对于网络有了一定的了解.现在我们来学习一些基础的 HTML/ CSS 知识.希望阅读完这篇文章能达到编写简单页面的程度. 目录: HTML/ CSS 的发明: HTML 基础 ...
- 使用Go语言开发一个短链接服务:三、项目目录结构设计
章节 使用Go语言开发一个短链接服务:一.基本原理 使用Go语言开发一个短链接服务:二.架构设计 使用Go语言开发一个短链接服务:三.项目目录结构设计 使用Go语言开发一个短链接服务:四.生成 ...
- JSON.stringify() 第三个参数的使用
语法 JSON.stringify(value[, replacer[, space]]) 参数说明: value: 必需, 要转换的 JavaScript 值(通常为对象或数组). replacer ...