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服务器实现。所有存储引擎都是以自有方式实现加锁机制的。
MySQL——并发控制(锁)的更多相关文章
- 【MySQL】锁入门
要做的完全掌握MySQL/InnoDB的加锁规则,甚至是其他任何数据库的加锁规则,需要具备以下的一些知识点 了解数据库的一些基本理论知识:数据的存储格式 (堆组织表 vs 聚簇索引表):并发控制协议 ...
- 浅谈数据库并发控制 - 锁和 MVCC
在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制. 如果数据库中的所有事务都是 ...
- MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)
原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是 ...
- mysql的锁机制详解
这段时间一直在学习mysql数据库.项目组一直用的是oracle,所以对mysql的了解也不深.本文主要是对mysql锁的总结. Mysql的锁主要分为3大类: 表级锁:存储引擎为Myisam.锁住整 ...
- mysql的锁与事务
1. MySQL中的事物 1.InnoDB事务原理 1. 事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致性状态转换为另一种一致性状态. 2. 在数据库提交 ...
- MySQL:锁机制和隔离事务级别
在mysql中的锁看起来是很复杂的,因为有一大堆的东西和名词:排它锁,共享锁,表锁,页锁,间隙锁,意向排它锁,意向共享锁,行锁,读锁,写锁,乐观锁,悲观锁,死锁.这些名词有的博客又直接写锁的英文的简写 ...
- 五分钟详解MySQL并发控制及事务原理
在如今互联网业务中使用范围最广的数据库无疑还是关系型数据库MySQL,之所以用"还是"这个词,是因为最近几年国内数据库领域也取得了一些长足进步,例如以TIDB.OceanBase等 ...
- mysql乐观锁总结和实践--转
原文地址:http://chenzhou123520.iteye.com/blog/1863407 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任 ...
- mysql行锁和表锁
mysql innodb支持行锁和表锁,但是MyIsam只支持表锁.现在我们说说mysql innodb的行锁和 有如下表id为主键 为了出现演示效果,我们将mysql的autocommit设置为0 ...
- MYSQL的锁介绍,以及死锁发生情况-带例子
mysql锁能在并发情况下的mysql进行更好的优化 MySQL有三种锁的级别:页级.表级.行级,这3种锁的特性可大致归纳如下: 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高 ...
随机推荐
- Rebound动画框架简单介绍
Rebound动画框架简单介绍 Android菜鸟一枚,有不对的地方希望大家指出,谢谢. 最近在接手了一个老项目,发现里面动画框架用的是facebook中的Rebound框架,由于以前没听说过,放假时 ...
- PHP生成月历代码
<?php /* Function Written by Nelson Neoh @3/2004. For those who wants to utilize this code, p ...
- vue2.0中怎么获取元素
在元素上添加 v-el:food-wrapper (不用驼峰的写法) vue1版本 报错: vue2版本 (vue2把vue1中的 v-el 改为了 ref vue1 v-el:foods-wrapp ...
- Web开发人员不容错过的10个HTML5工具
HTML5已经成为当今世界的一个必定组成部分.由于World Wide Web万维网是使用超文本标记语言来架构和呈现的,于是HTML5成为了最流行的编程语言之中的一个.随着网络的不断扩张,Web开发者 ...
- 两段用来启动/重启Linux下Tomcat的Perl脚本
两段代码,第二段比较好些. 下面是Split输出结果方式的代码: #!/usr/local/bin/perl #Date:2015-07-07 print "Begin to restart ...
- 开源 免费 java CMS - FreeCMS2.1 会员我的留言
项目地址:http://www.freeteam.cn/ 我的留言 从左側管理菜单点击我的留言进入.在这里能够查看当前登录会员的全部留言记录. 查看留言 点击留言标题能够查看留言具体内容. 删除留言 ...
- 导出txt格式的说明书
/// <summary> /// 说明书 /// </summary> /// <returns></returns> public FileResu ...
- Linux远程无密码登陆并远程执行脚本
假设 A (192.168.20.59)为客户机器,B(192.168.20.60)为目标机: 要达到的目的: A机器ssh登录B机器无需输入密码: 加密方式选 rsa|dsa均可以,默认dsa ss ...
- 双向数据绑定---AngularJS的基本原理学习
Angular JS (Angular.JS) 是一组用来开发Web页面的框架.模板以及数据绑定和丰富UI组件.它支持整个开发进程,提供web应用的架构,无需进行手工DOM操作. AngularJS非 ...
- hibernate出现 org.hibernate.PropertyNotFoundException: field [departmen] not found on cn.itcast.hibernate.domain.Employee1错误
hibernate出现 org.hibernate.PropertyNotFoundException: field [departmen] not found on cn.itcast.hibern ...