mysql事务与锁的机制
我们先来谈谈mysql的锁
锁:顾名思义就是对某个资源(可以是一张表,也有可能是一行或者多行记录)进行加锁操作,让自己有优先处理的权利。唉姑且就这么理解吧!
那么mysql究竟有哪几种类锁呢?
- 共享锁
某些地方叫乐观锁,其实也是它了(东叫一下西叫一下ztm晕,能不能有个统一的叫法!!)那共享锁是怎么个意思呢?还是先举个例子说吧,假如说事务A读到一条记录,并且修改了该条记录的一个字段的值a改成了b,正在这个时候事务B也读到了这条记录并且获取的A事务修改后的字段值b(不会不知道mysqlupdate时候会对记录加锁吧),事务B想把该字段的值改为c,在此时事务A的修改操作并未提交。那对不起了事务B,因为是事务A先对该记录加锁的,你此时还没有对该条记录上锁的权限哦,不要急哦,等事务A提交之后你就可以改了。
好了,差不多明白共享锁了吧,有点啰嗦了,还是简单的在说下吧。
共享锁就是只针对update时候加锁,在未对update操作提交之前,其他事务只能够获取最新的记录但不能够update操作。
2.排他锁
某些地方也把他叫做悲观锁,那么我来给你说下这种锁是怎么个悲剧法的哈,稍等。。。
还是一样,先来个例子展示下它的悲剧
还是用上个例子吧,事务A查到一个记录,并修改了其中的一个字段a的值为b,这个时候事务B来获取这条记录,我靠,怎么获取不到呢?原来是排他锁在作怪,这是什么情况。原来排他锁在获取记录的时候就对这条记录上了锁,而且别的事务连获取这条记录的权限都没有,更别提要修改了,必须等到事务A提交了事务释放了锁之后别的事务才能够获取到这条记录。排他锁,你也太tm小心眼了吧!!
所以,知道什么是排他锁了吧,
一句话,就是在一开始就对记录上锁了,在本事务未提交之前别的事务无权进行任何操作。我晕,我觉得该把它叫小气锁更好更贴切。
那么既然有这两种锁,你认为那种锁比较好,你会选用哪种锁呢?
呵呵,不要听我的误导哦,其实这两种锁各有利弊,不要看叫乐观锁就很乐观,叫悲观锁就很悲观哦,这个要看你项目的具体业务的。。
假如你的项目对并发很高对效率要求很高,那么你该选用乐观锁,因为在别的事务对某些记录上锁后在事务未提交之前其他事务是有权限去查看的,但是当出现意外导致事务回滚时候,其他事务会多进行一步操作,那就是重新获取这些对象了,不过这比排队等锁要好多了
假如你的项目并发数不是很多,同时对整个业务的原子操作要求很高这个时候排他锁是很不错的选择。
好了,前面我们废话了这么多,那么mysql究竟能对那些对象上锁呢?带着这个问题下一步我们就得了解下mysql的锁的级别了。
mysql锁的级别分为三类:页级锁,表级锁,行级锁。
那有三个级别的锁,mysql究竟用的是哪个级别的呢?这个还得看你用的是什么mysql的引擎了
mysql大概有下面几个数据库引擎和对应的锁级别
MyISAM引擎:使用的是表级锁
MEMORY/heap:使用的是表级锁
BDB:使用的是页级锁,不过它也支持表级锁的哦
InnoDB:使用的是行级锁,它夜支持表级锁的哦
好了,关于锁的东西我大概的是说完了,下面在聊聊mysql的事务吧
事务是什么东西,那么我们还是来简单说下吧
事务,以我的理解来说就是对数据库的一次原子性的操作。
这个原子操作包含多个数据操作语句,要是单条select语句就没有加事务的必要性了。
那么在多个事务对共享数据进行操作时就容易发生数据不一致啊等等的问题了,那么sql标准定义了如下几个名词
1、脏读(dirty reads)
定义:一个事务读取了另一个并行事务未提交但更改过的数据。
2、不可重复读(non-repeatable reads)
一个事物重新读取前面读过的数据出现不一致,两次读取中间该数据已被其他事务修改过。
3、泛读(phantom read)
一个事务重新去执行一次查询发现有新的一条或者一批新的记录,或者少了一条或者一批记录导致两次读取数据的总数出现不一致。
从上面可以看出,会出现如上这些问题肯定不会使用的是悲观锁咯,悲观锁在读取记录的时候就对对象加锁。不过一般项目中使用悲观锁的的确不怎么推荐。那既然这样的话,如果使用加锁来避免这些情况那么只能使用悲观锁喽,我们都知道悲观锁对性能和效率会大打折扣的,在一些高并发网站中肯定是不会使用这类锁的,所以这就出现了并发事务隔离级别来解决这类问题,下面来了解下sql事务的隔离级别。
sql事务的隔离级别有如下几类
1、读未提交
一个事务读到另一个没有提交的事务中的数据。
2、读已提交
3、可重复读(mysql的默认隔离级别)
4、可串行化
各隔离级别的数据一致性匹配表
事务隔离级别 |
脏读 |
不可重复读 |
泛读 |
读未提交 |
可能 |
可能 |
可能 |
读已提交 |
不可能 |
可能 |
可能 |
可重复读 |
不可能 |
不可能 |
可能 |
可串行化 |
不可能 |
不可能 |
不可能 |
分享到:
相关推荐
Mysql事务以及锁原理讲解,方便大家了解mysql事务和锁的原理
06-VIP-深入理解Mysql事务隔离级别与锁机制.pdf
1.事务 1.1 什么是事务? 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。 1.2 哪些引擎支持事务 InnoDB支持事务 1.3 事务的四大特性 原子性(Atomicity):强调事务的不可分割,...
mysql的锁机制和事务
系统介绍mysql锁机制
mysql 事物与锁详解,详细描述事物产生的前因后果与解决方案. 锁的力度都有解释。,很好的学习资料
详解Mysql事务隔离级别与锁机制.doc
深入理解Mysql事务隔离级别与锁机制.pdf
4-7深入理解Mysql事务隔离级别与锁机制.mp4
4-6深入理解Mysql事务隔离级别与锁机制.mp4
项目9--MySQL数据库中的事务机制与锁机制.pptx
主要包括锁机制、表锁、行锁、间隙锁、页锁,具体的应用案例分析、案例总结、行锁分析、表锁分析以及优化建议
内容概要:题目涵盖了MySQL的基础概念、索引、事务、锁、视图、存储过程、备份恢复等方面的知识点,适合用于MySQL的初级和中级面试。 适用人群:适用于对MySQL有一定了解和使用经验的后端开发人员、DBA、面试官和...
1.数据库版本 2. 数据库引擎 3. 事务隔离级别 4. 查看gap锁开启状态 5. 查看增锁模式 1. 基本锁 2. 意向锁(Intention Locks
本文基于MySQL5.7为基础,讨论与数据库事务和锁的相关内容。 锁机制 根据加锁的范围,MySQL里面的锁可以分成全局锁、表级锁和行锁三类。 全局锁 全局锁能够对整个库实例进行加锁。 加锁的语法: FLUSH TABLES WITH ...
脏读、不可重读度、幻读,其实都是数据库的一致性问题,必须由一定的事务隔离机制来解决。性能高和事务完全隔离性无法同时满足,DB提供了4项事务隔离级别来权衡,需要用户根据自身业务来选择合适的隔离级别。隔离...
锁机制:探讨MySQL中的锁类型和锁争用问题。 死锁处理:如何识别和解决事务中的死锁问题。 事务日志:事务日志的作用和恢复机制。 批量操作和事务:在执行大量数据插入或更新时如何有效使用事务。 分布式事务:涉及...
深入介绍了SQL Server的锁的机制,锁与事务隔离等级的关系及影响,分析了死锁的案例和解决方案。提出了锁的性能分析方法,分析并发性阻塞的问题和应用技巧。
本文实例讲述了MySQL锁机制与用法。分享给大家供大家参考,具体如下: MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁;BDB存储引擎采用的是...
Mysql为了解决并发、数据安全的问题,使用了锁机制。可以按照锁的粒度把数据库锁分为表级锁和行级锁。 表级锁 对当前操作的整张表加锁,实现简单 ,资源消耗也比较少,加锁快,不会出现死锁 。其锁定粒度最大,触发...