MySQL——并发控制(锁)

核心知识点:

1.表锁和行级锁代表着锁的级别;读锁和写锁代表锁定真实类型。

2.读锁属于共享锁,共享同一资源,互不干扰;写锁属于排他锁,为了安全起见,写锁会阻塞其他的读锁和写锁。

3.表锁的开销最小,行级锁的开销最大。

4.使用表锁不用考虑存储引擎,行级锁是由存储引擎实现的,而不是由MySQL服务器来实现。

5.每种锁都有特定的用途,看似没用的表锁与ALTER TABLE就很搭调。

无论何时,只要不止一个查询同时修改数据,都会产生并发控制问题。而解决并发问题最直接的方法就是上锁,以此来限制事务的开始。

这样,创建何种类型的锁才能让系统资源的利用率更高,执行的速率更快,就是主要问题。

当然本章也不会阐述如何建锁,这属于优化层面的问题。下面会阐述几个关于概念性的问题,包括读锁、写锁、表锁等。

1.读锁/写锁

在处理并发或并写时,系统会使用一套锁系统来解决问题。这种锁由两类锁组成,通常称之为共享锁排他锁,或者叫读锁写锁

关于锁的概念:某一资源上的读锁是共享的或者说是互不阻塞的在同一时间,多个用户可以读取同一资源,而互不干扰

另一方面,写锁是排他的,也就是说,一个写锁会阻塞其他的读锁和写锁,这是出于安全的考虑,

在给定的时间里,只有一个用户能写入资源,以防止用户在写操作的同时其他用户读取同一资源。

对于数据库来说,随时随地都会发生锁。当某一用户修改某一部分数据时,MySQL会禁止其他用户读取统一数据。

大多数时候,MySQL都是以透明的方式实现锁的内部管理。

2.锁粒度

一种提高共享资源并发性的方法就是让锁定对象更有选择性。要记住只锁定部分须修改的数据,而不是所有的资源。

更理想的方式是,只对要修改的数据片精确加锁。任何时间,在给定的资源上,被加锁的数据量越小,就可以允许更多的并发修改,只要互相之间互不冲突即可。

这么做的问题是加锁也会消耗系统资源每一种锁操作、检查锁是否已解除以及释放锁等,都会增加系统的开销

如果系统花费大量的时间来管理锁,而不是读/写数据,那么系统整体性可能会因此受到影响。

所谓的锁策略,就是在锁开销和数据安全之间寻求一种平衡,这种平衡也能影响系统性能,

大多数的商业数据库服务器没有提供更多的选择,通常都是在表上施加行级锁,并提供复杂的手段,在有锁的情况下改善系统的性能。

而另一方面,MySQL则提供了多种选择。每种MySQL存储引擎都可以实现独有的锁策略或锁颗粒。

在存储引擎设计中,锁管理是个非常重要的议题。

将颗粒度调整到某一水平,也许能为某种应用目的提供更佳的性能,不过,这也可能使存储引擎又不适用于其他的用途了。

由于MySQL可以提供多种存储引擎,所以它不需要一个通用解决方案。下面介绍两种最重要的锁策略。

表锁(Table lock)

MySQL支持大多数基本的锁策略,其中开销最小的锁策略是表锁

表锁将整张表加锁。当一个用户对表进行写操作(如插入、删除、更新)时,用户可以获得一个写锁。

写锁会禁止其他用户的读/写操作。另外,只有无人做写操作时,用户才能获得读锁,读锁之间是互不冲突的。

在特定的环境中,表锁可能性能良好。例如,READ LOCAL表锁支持某种类型的并发写操作。

另外,写锁比读锁有更改的优先级,即使有读操作用户已排在队列中,,一个被申请的写锁仍可以排在锁队列的前列(写锁会被安置在读锁之前,而读锁不能排在写锁之前)。

虽然存储引擎管理自己的锁,MySQL本身也能使用各种有效的表锁,以用于各种目的。

例如,MySQL服务器可以在语句中,如ALTER TABLE语句中,使用表锁,而不用考虑存储引擎,同时花销也小。

行级锁(Row locks)

行级锁可以支持最大的并发处理(同时也带来最大的锁开销)。众所周知,行级锁在InnoDB和Falcon存储引擎中得以实现,在其他一些存储引擎中也有实现。

行级锁由存储引擎实现,而不是MySQL服务器实现。所有存储引擎都是以自有方式实现加锁机制的。

时间: 2024-11-05 11:33:45

MySQL——并发控制(锁)的相关文章

上课笔记第三十一天MySQL并发控制、引擎、用户权限管理、查询缓存

1.MySQL并发控制机制        并发控制:每个会话会启动一个mysql线程               服务器层:用于控制锁               存储引擎层:并发访问控制基本上应该由存储引擎层完成 锁:lock                读锁:共享锁                写锁:独占锁 锁力度:                 表级锁:myisam表级锁                 行级锁:innodb行级锁 锁分类:                 隐式锁:由

浅谈数据库并发控制 - 锁和 MVCC

在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制. 如果数据库中的所有事务都是串行执行的,那么它非常容易成为整个应用的性能瓶颈,虽然说没法水平扩展的节点在最后都会成为瓶颈,但是串行执行事务的数据库会加速这一过程:而并发(Concurrency)使一切事情的发生都有了可能,它能够解决一定的性能问题,但是它会带来更多诡异的错误. 引入了并发事务之后,如果不对事务的执行进行控制就会

MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)

原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或线程并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素.从这一角度来说,锁对于

MySQL 表锁和行锁 问题

概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制. MySQL大致可归纳为以下3种锁: 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发度也最高. 页面锁:开销和加锁时间界于表锁和行锁之间:会出现死锁:锁定粒度界于表锁和行锁之间,并发度一般 ----------------------------------------------

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制

首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行. (2) C:一致性(Consistency) 事务完成时,数据必须处于一致的状态.若事务执行途中出错,会回滚到之前的事务没有执行前的状态,这样数据就处于一致的状态.若事务出错后没有回滚,部分修改的内容写入到了数据库中,这时数据就是不一致的状态. (3) I:隔离性(Isolation) 同时处理多个事务时

Mysql的锁机制与PHP文件锁处理高并发简单思路

以购买商品举例: ① 从数据库获取库存的数量. ② 检查一下库存的数量是否充足. ③ 库存的数量减去买家购买的数量(以每个用户购买一个为例). ④ 最后完成购买. 仅仅这几行逻辑代码在并发的情况下会出现问题,自己可以想象一下. 这里暂时就不测试了,下面会针对并发的处理给出测试结果. 创建表: CREATE TABLE `warehouse` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', `stock` int(11) NOT NULL

mysql乐观锁总结和实践

上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景,它也有它存在的一些不足,因为悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性.如果加锁的时间过长,其他用户长时间无法访问,影响了程序的并发访问性,同时这样对数据库性能开销影响也很大,特别是对长事务而言,这样的开销往往无法承受.所以与悲观锁相对的,我们有了乐观锁,具体参见下面介绍: 乐观锁介绍: 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据

mysql行锁和表锁

mysql innodb支持行锁和表锁,但是MyIsam只支持表锁.现在我们说说mysql innodb的行锁和 有如下表id为主键 为了出现演示效果,我们将mysql的autocommit设置为0 打开两个mysql命令行窗口,都设置为autocommit为0 窗口1: 窗口2: 这时候我们发现窗口2一直在阻塞,当我们在窗口1中commit后,发现窗口2有输出了. 上面我们更新不是同一个记录,为什么事物1没提交时,事物2一直等待了.因为这个时候用的是表锁. 现在我们给name字段加上索引,效果

mysql乐观锁总结和实践(转)

原文:mysql乐观锁总结和实践 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景,它也有它存在的一些不足,因为悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性.如果加锁的时间过长,其他用户长时间无法访问,影响了程序的并发访问性,同时这样对数据库性能开销影响也很大,特别是对长事务而言,这样的开销往往无法承受.所以与悲观锁相对的,我们有了乐观锁,具体参见下面介绍: 乐观锁介绍: 乐观锁( Optimistic Locking )

mysql: 关于MySQL InnoDB锁行还是锁表?

baidu zone - 关于MYSQL Innodb 锁行还是锁表,深入讲解