《MySQL——锁》

全局锁是什么?全局锁有什么用?全局锁怎么用?

全局锁主要用在逻辑备份过程中,对于InnoDB 引擎的库,使用–single-transaction;
MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL),让整个库处于只读状态。

表锁是什么?表锁有什么用?表锁怎么用?

表锁一般是在数据库引擎不支持行锁的时候才会被用到的.
表锁的语法是 lock tables … read/write;
加上读锁,不会限制别的线程读,但会限制别的线程写。加上写锁,会限制别的线程读写。

行锁是什么?行锁有什么用?行锁怎么用?

行锁就是针对数据表中行记录的锁。
比如事务 A 更新了一行,而这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。
在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。
在这里插入图片描述
事务 B 的 update 语句会被阻塞,直到事务 A 执行 commit 之后,事务 B 才能继续执行。
一定知道了事务 A 持有的两个记录的行锁,都是在 commit 的时候才释放的。若行锁不是在 commit 之后被释放,而是在该语句执行完就被释放,则不会出现事务 B 被锁住。
如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。
调整语句顺序并不能完全避免死锁。

死锁与死锁检测

并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁
为了避免这个操作,常用死锁检测。
发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参innodb_deadlock_detect 设置为 on,表示开启这个逻辑。
死锁检测算法复杂度很高 N个进程,遍历N遍,M个资源,每个资源操作一次。则复杂度 O(M*N^2)。
假设有 1000 个并发线程要同时更新同一行,那么死锁检测操作就是 100 万这个量级的。最终检测的结果可能是没有死锁,但是这期间要消耗大量的 CPU 资源。

何时会死锁检测

每条事务执行前都会进行检测吗?
并不是,如果他要加锁访问的行上有锁,他才要检测。
一致性读不会加锁,就不需要做死锁检测;
并不是每次死锁检测都都要扫所有事务。比如某个时刻,事务等待状态是这样的:
B在等A,
D在等C,
现在来了一个E,发现E需要等D,那么E就判断跟D、C是否会形成死锁,这个检测不用管B和A。
死锁检测其实就是算法,环的检测,不必每次遍历一遍当前事务,只需要判断事务链表中,每加入一个新事物后是否有环的生成,有就形成死锁。这个方法和leetcode的链表中的环检测应该是一个道理。

如何避免高量级的死锁检测

为了避免这个问题,一般来说有两种方法:
1、果你能确保这个业务一定不会出现死锁,可以临时把死锁检测关掉。一旦发生死锁现象,则会出现超时(50s)
2、控制并发度:

1、对于相同行的更新,在进入引擎之前排队。
2、减少行更新锁冲突的方法:将单行拆成逻辑上的多行

练习

如果你要删除一个表里面的前 10000 行数据,有以下三种方法可以做到:

第一种,直接执行 delete from T limit 10000;
第二种,在一个连接中循环执行 20 次 delete from T limit 500;
第三种,在 20 个连接中同时执行 delete from T limit 500。

方案一,事务相对较长,则占用锁的时间较长,会导致其他客户端等待资源时间较长。
方案二,串行化执行,将相对长的事务分成多次相对短的事务,则每次事务占用锁的时间相对较短,其他客户端在等待相应资源的时间也较短。这样的操作,同时也意味着将资源分片使用(每次执行使用不同片段的资源),可以提高并发性。
方案三,人为自己制造锁竞争,加剧并发量。

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

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

相关文章

搜索引擎Constellio及Google Search Appliances connectors

做搜索产品的时候发现国外一个同类型的产品contellio,发现功能比较强大,先记录下来 貌似可以添加文档 网站 以及数据库等不同类型的数据源 http://wiki.constellio.com/index.php/Main_Page http://www.constellio.com/ http://www.constellio.com htt…

dig下载_DIG的完整形式是什么?

dig下载DIG:副监察长 (DIG: Deputy Inspector General) DIG is an abbreviation of the Deputy Inspector General. It is a high-level position in the Indian Police Service. The officers who already offered service on Senior Superintendent of Police (SS…

分类器是如何做检测的?——CascadeClassifier中的detectMultiScale函数解读

原地址:http://blog.csdn.net/delltdk/article/details/9186875 在进入detectMultiScal函数之前,首先需要对CascadeClassifier做初始化。 1. 初始化——read函数 CascadeClassifier的初始化很简单: cv::CascadeClassifier classifier; cl…

<MySQL>何时使用普通索引,何时使用唯一索引

如果能够保证业务代码不会写入重复数据,就可以继续往下看。 如果业务不能保证,那么必须创建唯一索引。 关于查询能力 普通索引和唯一索引在查询能力上是没有很大差别的。 如:select id from T where k5 1、普通索引查找到满足条件的第一个记…

Web版OutLook,利用POP接收邮件服务器邮件

一直想做一个Web版的OutLook,所以才萌生这个想法,其实以前也接触过这方面的东西。于是上网找了找,漫天的都是Jmail来接收,好吧,既然大家都在用我也就下载下来试试了。 什么,怎么总是报错呢?原来…

abs std::abs_ABS的完整形式是什么?

abs std::absABS:防抱死制动系统 (ABS: Anti-lock Braking System) ABS is an abbreviation of the Anti-lock Braking System. It is a safety anti-skid braking system that is used on a variety of aircraft, automobiles and other land vehicles, such as mo…

ubuntu 使用

shell 命令历史搜索 : ctrl r使能 session 选择界面:安装gnome-session-fallback安装lwqq转载于:https://www.cnblogs.com/JonnyLulu/p/3600263.html

汉字速查使用方法简介

《汉字速查》(HanziSearcher)是一个支持全汉字字典和词典的检索工具。其界面如下所示。 界面上方为工具栏。 左方为字典和词典检索栏。 右方在启动时显示版权信息和作者的联系方式,在执行检索时,显示检索结果。 检索方法 汉字速查…

android jni示例_Android服务示例

android jni示例A service is a component that runs in the background for supporting different types of operations that are long running. The user is not interacted with these. These perform task even if application is destroyed. Examples include handling of…

《MySQL——选错索引,该如何做》

如果不断地删除历史数据和新增数据,MySQL有时会选错索引。 选择索引是优化器的工作,优化器优化时会考虑的因素:扫描行数、是否需要排序、是否使用临时表 MySQL通过统计索引上的基数,作为索引的区分度。 统计方法时采样统计&#x…

LPWSTR 类型的实参与const.char *类型形参不兼容

CString csPlus; CString csSummand; m_PlusNumber.GetWindowTextW(csPlus); m_Summand.GetWindowTextW(csSummand); int nPlus atoi(csPlus.GetBuffer(0)); //将编辑框文本转换成整数// int nPlus atoi(strcpy(csPlus.GetBuffer(10),"aa")); csPlus.ReleaseBu…

空间换时间,把递归的时间复杂度降低到O(2n)

递归算法的时间复杂度除非只有前两项,否则都不是线性的,并且相当耗费内存。我们用最常见的的fibonacci数列来说明: function fibonacci(n){if( n 0 || n 1){return n;} else {return fibonacci(n - 1) fibonacci(n - 2);} } 这是一种最常见…

scala char_Scala中的Char数据类型

scala charScala Char数据类型 (Scala Char Data Type) Character (char) in Scala is a data type that is equivalent to 16-bit unsigned integer. The character data type stores a single character. It can be an alphabet, numbers, symbols, etc. The character takes…

《MySQL——给长字符串加索引》

对于长字符串,可用如下方式建立索引: (1)前缀索引 (2)字符串倒叙前缀索引 (3)添加hash字段并在hash字段上加索引 (4)字段拆分(一个字段可拆分为两…

[蓝桥杯历届试题] 欧拉与鸡蛋

大数学家欧拉在集市上遇到了本村的两个农妇,每人跨着个空篮子。她们和欧拉打招呼说两人刚刚卖完了所有的鸡蛋。 欧拉随便问:“卖了多少鸡蛋呢?” 不料一个说:“我们两人自己卖自己的,一共卖了150个鸡蛋,虽然…

Python元组练习

Here, we are covering following Python tuple exercises, 在这里,我们将介绍以下Python元组练习 , Creating & printing a tuple 创建和打印元组 Unpacking the tuple into strings 将元组解包成字符串 Create a tuple containing the letters of…

傻瓜教你看清MVC内部执行流程之ViewData数据传输,轻松学MVC--①目了然篇(待续)

1.首先在执行到Controller里面的action(方法)时,执行到最后会调用一个View()-->此方法是Controller的一个方法 源代码: View Code protected internal ViewResult View(){return View(null /* viewName */, null /* masterName */, null /* model */);} 2.然后继续调用自己…

《MySQL——count()逻辑》

count()用法 count()语义:该函数为一个聚合函数,对于返回的结果集一行行地判断,如果count函数地参数不是NULL,累计值就加1,否则不加。最后返回累计值。 所以count(*),count(主键id)和count(1)都表示返回满足条件地结果…

phpmailer 发送邮件

<?php /* 可用新浪和网易邮箱测试成功&#xff0c;但QQ不成功&#xff01; 下载 phpmailer 解压 http://phpmailer.worxware.com/要注意邮件服务器的端口号&#xff0c;默认是 25 不用修改&#xff0c;如果不是则要修改如下&#xff0c;在$mail->IsSMTP() ;下一行加上 $…

静态负载均衡和动态负载均衡_动态负载平衡

静态负载均衡和动态负载均衡动态负载平衡 (Dynamic Load Balancing) The algorithm monitors changes on the system workload and redistributes the work accordingly. 该算法监视系统工作负载的变化并相应地重新分配工作。 This algorithm works on three strategies: 该算…