表级锁的mysql读写_Mysql的表级锁

我们首先需要知道的一个大前提是:mysql的锁是由具体的存储引擎实现的。所以像Mysql的默认引擎MyISAM和第三方插件引擎 InnoDB的锁实现机制是有区别的。可根据不同的场景选用不同的锁定机制。

Mysql有三种级别的锁定:表级锁定、页级锁定、行级锁定

一、定义

每次锁定的是一张表的锁机制就是表级别锁定(table-level)。它是MySQL各存储引擎中粒度最大的锁定机制。

二、优缺点

1. 优点

实现逻辑简单,开销小。

获取锁和释放锁的速度快。

由于表级锁一次会将整个表锁定,所以能很好的避免死锁问题。

2. 缺点

由于锁粒度最大,因此出现争用被锁定资源的概率也会最高,致使并发度十分低下。

三、支持存储引擎

使用表级锁定的主要有MyISAM,MEMORY,CSV等一些非事务性存储引擎。

四、表级锁类型

MySQL的表级锁有两种类型:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。

锁模式的兼容性:

对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作;

对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;

MyISAM表的读操作与写操作之间,以及写操作之间是串行的。当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。

五、如何加表锁

在执行查询语句(select)前,会自动给涉及的所有表加读锁

在执行更新操作(update、delete、insert等)前,会自动给涉及的表加写锁。这个过程并不需要用户干预,因此不需要直接用lock table命令给MyISAM表显式加锁。

显示加写锁:

// 当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。

// 其他线程的读、写操作都会等待,直到锁被释放为止。

// test表将会被锁住,另一个线程执行select * from test where id = 3;将会一直等待,直到test表解锁

LOCK TABLE test WRITE;

显示加读锁

// test表将会被锁住,另一个线程执行select * from test where id = 3;不会等待

// 执行UPDATE test set name='peter' WHERE id = 4;将会一直等侍,直到test表解锁

LOCK table test READ;

显示释放锁:

UNLOCK TABLES;

需要注意的是,在同一个SQL session里,如果已经获取了一个表的锁定,则对没有锁的表不能进行任何操作,否则会报错。

// 锁定test表

LOCK table test WRITE;

// 操作锁定表没问题

SELECT * from test where id = 4;

// 操作没有锁的表会报错

SELECT * from bas_farm where id =1356

报错:[Err] 1100 - Table 'bas_farm' was not locked with LOCK TABLES。这是因为MyISAM希望一次获得sql语句所需要的全部锁。这也正是myisam表不会出现死锁的原因。

当然,你也不必担心,MyISAM引擎的默认方式是会给同一个session里的所有表都加上锁的,不会麻烦你自己显示操作的。

六、查看表级锁争用情况

执行:show status like ‘table%’;

mysql> show status like 'table%';

+----------------------------+-----------+

| Variable_name | Value |

+----------------------------+-----------+

| Table_locks_immediate | 20708 |

| Table_locks_waited | 0 |

+----------------------------+-----------+

Table_locks_immediate:产生表级锁定的次数;

Table_locks_waited:出现表级锁定争用而发生等待的次数;

如果Table_locks_waited状态值比较高,那么说明系统中表级锁定争用现象比较严重,就需要进一步分析为什么会有较多的锁定资源争用了。

七、优化表级锁定

优化表级锁时的最大问题是:提高并发度

###1. 通过减少查询时间缩短锁定时间

缩短锁定时间的总体原则是:让Query执行时间尽可能的短。

尽量减少大的、复杂的Query,将复杂Query分拆成几个小的Query分步执行;

尽可能的建立足够高效的索引,让数据检索更迅速;

尽量让MyISAM存储引擎的表只存放必要的信息,控制字段类型;

利用合适的机会优化MyISAM表数据文件。

###2. 设置可并发插入:concurrent_insert=2

MyISAM的表锁虽是读写互相阻塞的,但依然能够实现并行操作。MyISAM存储引擎有一个控制是否打开Concurrent Insert(并发插入)功能的参数选项:concurrent_insert,取值范围为0,1,2。

concurrent_insert=0,不允许并发插入。

concurrent_insert=1,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个线程读表的同时,另一个线程从表尾插入记录。这是MySQL的默认设置;

concurrent_insert=2,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录;

所以,我们可通过设置concurrent_insert=2,同时定期在系统空闲时段执行optimize table tableName语句来整理空间碎片,收回因删除记录而没有真正释放的空间,从而提高并发。optimize参考:mysql中OPTIMIZE TABLE的作用及使用

###3. 合理设置读写优先级

MyISAM存储引擎默认是写优先级大于读优先级。即使是写请求后到,写锁也会插到读锁请求之前。

但是,有时像修改文章点击数 操作是不那么重要的,我们希望的是读更快,此时我们可以这样:

UPDATE LOW_PRIORITY article SET click_num=134 WHERE id = 823

LOW_PRIORITY使得系统认为update操作优化级比读操作低,如果同时出现读操作和上面的更新操作,则优先执行读操作。

MySQL提供了几个语句调节符,允许你修改它的调度策略:

LOW_PRIORITY关键字应用于:DELETE、INSERT、LOAD DATA、REPLACE和UPDATE。

HIGH_PRIORITY关键字应用于:SELECT、INSERT语句。

delayed(延迟)关键字应用于:INSERT、REPLACE语句。

如果你希望所有支持LOW_PRIORITY选项的语句都默认地按照低优先级来处理,那么可能使用**low-priority-updates**选项来启动服务器。然后可通过使用insert HIGH_PRIORITY table.....来把个别我们希望的INSERT语句提高到正常的写入优先级。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

account表里有什么 银行_模拟一个银行账户类Account,账户类中包括所有者、账号、余额、账户总数、存款、取款等信息。_学小易找答案...

【单选题】廉价磁盘冗余阵列RAID利用冗余技术实现高可靠性,其中RAID1的磁盘利用率为() 。【简答题】与直流调速相比,交流调速有何优点?【论述题】方法【单选题】以《老子注》一书驰名汉学界的学者是下列哪一位 ______【填空题】本任务中,所需的实训设备有:( )、( )、( )【单选…

创建mysql视图语法正确的是_MySQL创建视图的语法格式

视图,具有简化查询语句、安全性和保证逻辑数据独立性等作用创建视图的语法格式视图中,包含SELECT查询的结果,因此,视图的创建基于SELECT语句,和已经存在的数据表,视图可以建立在一张表上,也可以…

爬空气质量MySQL_爬虫:利用selenium采集某某环境网站的空气质量数据

前言:在上一篇文章中,我们介绍了在http://PM2.5.in这个网站采集空气质量的数据,本篇文章是对其产生的一些问题的另一种解决方案,提供更加权威的数据采集。技术框架:selenium、json、etree这里的selenium是一种自动化测…

mysql导出数据意义_11、mysql导出数据

1、使用select... into outfile语句导出数据(1)txt格式select *from runoob.tb1 into outfile /tmp/runoob.txt;(2)CSV格式select * from passwd into outfile /tmp/runoob.txt fields terminated by , enclosed by " lines terminated by \r\n;(3)生成一种文件&#xff0…

操作失败10秒内未完成启动服务mysql_01-MySQL 命令行-cmd用法-未完成

01.png02.png03.png04.png05.png06.png07.png08.png09.png一、mysql服务的启动和停止net stop mysqlnet start mysql二、登陆mysql语法如下: mysql -u用户名 -p用户密码键入命令mysql -uroot -p, 回车后提示你输入密码,输入12345,…

java时间聚类_mongodb 按照时间聚类 java

当存储到mongodb中的是string类型的时间,小tips:1. 那么在对此域按照时间聚类(每周,每月)时就不能直接使用mongodb的time关键字了,因为mongodb有自己的时间类型,且目前它只认可自己的时间类型。2. 假如对于时间进行简单的聚类&…

selenium python实例录制运行_WEB自动化测试工具selenium录制器使用笔记

简介selenium录制器是最近刚流行起来的一个WEB自动化测试工具,由多测测团队开发。Selenium录制器采用关键字驱动的理念,简化测试用例的创建和维护,可以直接运行在浏览器中,就像真正的用户在操作一样。自动化脚本录制、一键回放、报…

cass坡度土方计算案例_60度斜坡怎么计算_南方CASS土方计算方法—方格网法

01概述在我们的日常工作中,遇到大量的土方修正算的相关咨询,为什么CASS的方格网土方修正算,方格设定为10米和20米,修正算结果有很大差异呢?从软件计算原理、数据质量等方面进行分析,读了这篇文章&#xff0…

java ssh cpu_初学Java ssh之Spring 第四篇

今天我来学习学习Spring中Bean。在Spring中原来还有标签啊,它相当于标签的老爸,老爸可以有很多个儿子,但是老爸只有一个哦。也就是说一个标签内可以有多个标签,每个标签代表一个java实例。定义时,需要注意两个属性&…

java中servlet知识_jsp_Servlet常用知识总结

Servlet三个要素[java] view plain copy print?1.必须继承自HttpServlet2.必须实现doGet()或者doPost()3.必须在web.xml中配置ServletHttpServeltRrequest:请求对象getParameter():获得表单元素的值getAttribute():获得request范围中的属性值setAttribute():设置reqeust范围中…

java语言执行模式,使用java.exe执行静默模式

I would like to know if there is a way to execute the "java.exe" as a background process (silent mode execution)Ex: java -cp . MyClass arg1I want to run the above statement as a background process , without opening command window解决方案Under Win…

linux下tomcat部署java web项目_求助帖 linux服务器 tomcat部署javaweb项目问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼03-Sep-2018 17:42:07.330 SEVERE [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:org.apache.catalina.LifecycleException: Failed to start component [Stan…

rabbitmq+topic+java_译:5.RabbitMQ Java Client 之 Topics (主题)

我们使用的是direct(直接交换),而不是使用只能进行虚拟广播的 fanout(扇出交换),并且有可能选择性地接收日志。虽然使用direct(直接交换)改进了我们的系统,但它仍然有局限性 - 它不能基于多个标准进行路由。在我们的日志系统中,我…

java某个时间推迟60天_java计算两个时间相差(天、小时、分钟、秒)

public static long dateDiff(String startTime, String endTime,String format, String str) {// 按照传入的格式生成一个simpledateformate对象SimpleDateFormat sd new SimpleDateFormat(format);long nd 1000 * 24 * 60 * 60;// 一天的毫秒数long nh 1000 * 60 * 60;// …

java影碟租赁系统_java影碟管理系统

在学习基于javaweb的影碟管理系统项目的时候,方便日后能及时查阅,在本平台中记录一下基于javaweb的影碟管理系统的开发流程。在学习时候的选用了SSM(MYECLIPSE),这个框架不论是学习还是使用都非常方便,简单易上手。基于javaweb的影碟管理系统…

hasp 加密 java_加密软件HASP的使用说明

加密软件hasp使用说明1.hasp环境的搭建hasp环境的搭建要根据机器的环境来安装,①windows系统的就安装windows版本,安装步骤可以参考<录像>文件下里的hasp5.0系统安装.exe;②linux版本的需要安装linux版本,安…

java明文发送_使用java MD5加密网络明文

1.[代码][Java]代码import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/*** Created by liuhj on 2015/11/27.*/public class MD5 {public static void main(String args[]){StringMD5("123456");}public static String StringMD5(…

php设置session 生命周期,设置session的生命周期(php)

PHP中,Session变量保存在服务器端(默认以文件格式保存),而Session ID以cookie形式保存在客户端。销毁session的方法有2种第一种是通过程序session_destory()方法清除所有sessionunset(session[x])来清除指定的session[x]。第二种是通过关闭浏览器关闭后会…

php 查找无限级,Ztree + PHP 无限级节点 递归查找节点法

一、前言简单的描述一下,实习几个原理,思想,其实写很多东西,思想算是最重要的。1、目标:将写一个无限节点的树形目录结构,如下图步骤:1、你的下载 插件 ztree。然后布置在你的项目中。2、相关C…

用php实现一个简易的web表单生成器,网络编程PHP Web表单生成器案例分析

本文实例讲述了PHP Web表单生成器。分享给大家供大家参考,具体如下:1.实例:2. 需求分析在项目的实际开发中,经常需要设计各种各样表单。直接编写HTML表单虽然简单,但修改、维护相对麻烦。因此,可以利用PHP实…