MySQL中的锁

数据库中有很多锁,但锁是为了解决什么问题?具体都有哪些锁呢?这篇文章简单对MySQL中的锁做了一个总结

一、锁的设计是为了解决什么问题?

当多用户读写数据的时候,就有可能会出现同一时刻对同一条数据的读写,如果是大家都只是对同一条数据进行读,无所谓,大家读到数据都是一样的,但当有的想要读取数据,有的想要修改数据的时候,或者大家都想要修改数据的时候就会出现问题。比如有一行数据现在值是5,同一时刻有两个用户都想要修改这行数据,用户1和用户2此刻读到的数据都是5,用户1在数据5的基础上加了1变成6,并将6存进数据库里面,用户2在数据5的基础上加了2变成7,然后将7存进了数据库里面,这里面就出现了一个问题,用户1的修改丢失了。

所以数据库为了解决用户和共享数据的出现的问题,引入了锁。当用户1想要修改数据时,先必须获取锁,然后在修改,用户2想要修改数据时,也要先获取锁,但锁被用户1获取了,他只能等用户1修改完,释放锁后,才能继续修改数据。

根据锁的类型可以分为读锁,写锁

根据锁的范围可以分为全局锁,表级锁,行锁

二、读锁,写锁

当我们需要对一个数据进行读取的时候,就需要获取读锁,当我们对一个数据进行修改的时候,就需要获取写锁

读锁之间不互斥,当对一个数据加了读锁后,还可以对它继续加读锁,不能添加写锁

写锁与读锁之间,写锁与写锁之间互斥,当对一个数据加了写锁后,不能继续添加其他锁了,必须要等待写锁释放

三、全局锁

全局锁,会锁住整个数据库,整个数据库不可写入数据,不可修改数据表结构,只能读取数据,这样的话,就保证了整个数据库只读,最典型的应用就是全局备份数据,备份数据期间,我们不希望有数据能写入数据库中,不然后有可能备份后的数据是不完整的数据。

比如有两个表中的数据是关联的,第一张表a,第二张表b,表a增加一条记录时,表b就会记录一条关于表a操作的记录

现在在我们备份的时候,不加全局锁,考虑下面的情况

时刻1. 备份表a

时刻2. 表a插入了一条记录,表b也要记录一条

时刻3. 备份表b

这样的顺序下来,备份后的数据表b中多记录了一次操作

我们可以通过加全局锁,来实现在备份过程中,只能读取数据,无法修改数据,来保证备份后数据的一致性

四、表级锁

表级锁可分为两种,一种是表锁,一种元数据锁(MDL)

MDL锁不需要显示使用,在访问表的时候会自动加上

当要读取一个表时,要获取MDL读锁,当要修改一个表的结构的时候,就要获取MDL写锁。MDL主要是为了防止DDL和DML并发的冲突。

表锁锁一整表,锁的范围还是太大了。

五、行锁

行锁时目前最细粒度的锁了,只有Innodb引擎支持,MYISAM引擎只支持到表级锁

innodb事务开启后,行锁是需要的时候才会加上,但不是不需要了就会立即释放行锁,而是等整个事务提交之后,才会释放行锁。这个就是mysql的两阶段锁协议。

有这么一种场景,一个事务执行中,要执行很多条语句,其中有一条语句会更新同一行数据。当多个事务并发的时候,必定会争夺同一行数据的锁,当一个事务持有锁的时候,其他事务就必须等待。在这种场景下,我们该如何设计语句的执行顺序,让等待的时间最少?

我们已经知道了两阶段锁协议,锁在事务结束的时候才会释放,所以,把更新同一行数据的语句越往后放,等待的时间就会越少。

innodb已经有了行锁,但还是不能够保证并发事务的正确性,为此,innodb引入了新的锁,叫间隙锁,当要更新数据时,在一行行扫描加锁的过程中,不仅会加行锁,还会添加间隙锁,也就数据行之间的锁。

六、总结

MySQL中的锁机制就是为了解决共享资源的问题,为了从不同程度控制资源的读写,相应的引入了全局锁,表级锁,行锁,以及不同锁类型。

原文地址:https://www.cnblogs.com/time-read/p/11227107.html

时间: 2024-10-01 21:27:34

MySQL中的锁的相关文章

Mysql中那些锁机制之MyISAM

说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不支持外键,所以访问速度快.锁机制是表锁,支持全文索引 InnoDB :支持事务.支持外键,所以对比MyISAM,InnoDB的处理效率差一些,并要占更多的磁盘空间保留数据和索引.锁机制是行锁,不支持全文索引 Memory:数据是存放在内存中的,默认哈希索引,非常适合存储临时数据,服务器关闭后,数据会丢失掉. 如何选择存储引擎: MyISAM:应用是以读操作和插入操作为主

Mysql中那些锁机制之InnoDB

我们知道mysql在曾经.存储引擎默认是MyISAM.可是随着对事务和并发的要求越来越高,便引入了InnoDB引擎.它具有支持事务安全等一系列特性. InnoDB锁模式 InnoDB实现了两种类型的行锁. 共享锁(S):同意一个事务去读一行,阻止其它事务获得同样的数据集的排他锁. 排他锁(X):同意获得排他锁的事务更新数据,可是组织其它事务获得同样数据集的共享锁和排他锁. 能够这么理解: 共享锁就是我读的时候,你能够读,可是不能写.排他锁就是我写的时候.你不能读也不能写.事实上就是MyISAM的

MySQL中的锁(表锁、行锁)

锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素.从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂. 概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制. MySQL大致可归纳为以下3种锁: 表级锁:开销小,加锁快:不会出

MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁)

本文参考: http://mysqlpub.com/thread-5383-1-1.html http://blog.csdn.net/c466254931/article/details/53463596 有很多是转载合并过来. 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重

关于MYSQL中的锁

根据mysql存储引擎的不同,支持的锁也不同. myisam,memory,支持表级锁. innodb,支持行级锁和表级锁,默认为行级锁. 表级锁,把整个表锁住.锁表快.不存在死锁.冲突多. 行级锁,锁指定的行.锁表慢.可能出现死锁.冲突少. 关于死锁: 表中有2条数据X,Y.有两个人都想修改这两个数据.并且A先修改X,然后修改Y.B先修改Y,然后修改X. 这两个人同时执行这个事情. 表级锁:无论A先执行还是B先执行,都会先把表锁了,另一个人只能等待,知道第一个人操作完成.所以数据是肯定安全的.

Mysql中的锁机制

原文:http://blog.csdn.net/soonfly/article/details/70238902 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素.从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂.本章我们着重讨论MySQL锁机制 的特点,常见的锁问题

mysql中的锁机制之概念篇

锁的概念 ①.锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具. ②.在计算机中,是协调多个进程或线程并发访问某一资源的一种机制. ③.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源. ④.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题. ⑤.锁的冲突也是影响数据库并发访问性能的一个重要因素. MySQL锁的概述 相对于其它数据库而言,MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎支持不同的

5.MySQL中的锁

什么是锁?MySQL 中提供了几类锁? 锁是实现数据库并发控制的重要手段,可以保证数据库在多人同时操作时能够正常运行.MySQL 提供了全局锁.行级锁.表级锁.其中 InnoDB 支持表级锁和行级锁,MyISAM 只支持表级锁. 详解锁 全局锁: 对整个数据库实例加锁,MySQL提供了一个加全局读锁的命令:[Flush tables with read lock]-FTWRL.当需要让整个库处于只读状态,可使用这个命令.其他线程进行:增删改.数据定义(建表.修改表)和更新类事务的提交语句都会被阻

mysql中的锁的相关知识

数据库锁:数据库锁出现的原因是为了处理并发问题. 并发控制一般采用三种方法,分别是乐观锁和悲观锁以及时间戳. 乐观锁认为一个用户读数据的时候,别人不会去写自己所读的数据,就是不做任何操作.悲观锁就刚好相反,觉得自己读数据库的时候,别人可能刚好在写自己刚读的数据,其实就是持一种比较保守的态度,悲观锁就是在读取数据的时候,为了不让别人修改自己读取的数据,就会先对自己读取的数据加锁,只有自己把数据读完了,才允许别人修改那部分数据,或者反过来说,就是自己修改某条数据的时候,不允许别人读取该数据,只有等自