mysql锁

mysql 意向锁的作用

余生颓废 提交于 2020-01-13 11:53:25
直接copy知乎上的内容 https://www.zhihu.com/question/51513268 作者:尹发条地精 链接:https://www.zhihu.com/question/51513268/answer/127777478 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ①在mysql中有表锁, LOCK TABLE my_tabl_name READ; 用读锁锁表,会阻塞其他事务修改表数据。 LOCK TABLE my_table_name WRITe; 用写锁锁表,会阻塞其他事务读和写。 ②Innodb引擎又支持行锁,行锁分为 共享锁,一个事务对一行的共享只读锁。 排它锁,一个事务对一行的排他读写锁。 ③这两中类型的锁共存的问题 考虑这个例子: 事务A锁住了表中的 一行 ,让这一行只能读,不能写。 之后,事务B申请 整个表 的写锁。 如果事务B申请成功,那么理论上它就能修改表中的任意一行,这与A持有的行锁是冲突的。 数据库需要避免这种冲突,就是说要让B的申请被阻塞,直到A释放了行锁。 数据库要怎么判断这个冲突呢? step1:判断表是否已被其他事务用表锁锁表 step2:判断表中的每一行是否已被行锁锁住。 注意step2,这样的判断方法效率实在不高,因为需要遍历整个表。 于是就有了意向锁。 在意向锁存在的情况下

mysql:悲观锁与乐观锁

好久不见. 提交于 2020-01-12 09:07:59
为什么会使用到数据库级别的锁? 你可能会有这么一个疑问:现在的程序已经提供了很完善的锁机制来保证多线程的安全问题,还需要用到数据库级别的锁吗?我觉得还是需要的,为什么呢?理由很简单,我们再编程中使用的大部分锁都是单机,尤其是现在分布式集群的流行,这种单机的锁机制就保证不了线程安全了,这个时候,你可能又会想到使用redis的setNX分布式锁 或者 zookeeper的强一致性来保证线程安全,但是这里我们需要考虑到一个问题,那就是成本问题,有的时候使用redis分布式锁以及zookeeper会增加维护的成本,结合实际出发,再说没有百分百安全的程序,所以再数据库层加锁,也能将安全再提升一级,所以还是有必要的。 什么是悲观锁 悲观锁,正如其名,具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他 事务 ,以及来自外部系统的 事务处理 )修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的 排他性 ,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。 通俗的讲:开启一个事务之后开启悲观锁,这时候数据库将会锁着你需要查询的某条数据或者某张表,其他事务中的查询将会处于阻塞状态,开启悲观锁事务里面操作不会被阻塞,这点有点类似java中的互斥锁,那什么时候锁记录

mysql中的锁

你说的曾经没有我的故事 提交于 2020-01-12 08:53:00
mysql中的锁 本文所讨论的是mysql8.0中的锁。 一、行锁-锁模式 共享锁S和排他锁X InnoDB实现了两种行级锁,共享锁和排他锁。 共享锁:允许其他事务读取被锁住的行,但是不允许其他事务对被锁住的行进行写入操作。同时其他事务可以继续给该行加共享锁。 用法:select …for share 排他锁:防止其他事务读取或写入被该锁锁住的行,其他事务必须等待加锁事务的解锁之后才能操作,只有获取排他锁的事务可以读取数据或者写入数据。 用法:select …for update 二、表锁-意向锁 InnoDB支持多粒度的锁,为了实现多粒度锁,innodb采用了意向锁。意向锁是表级锁,表示稍后将对表中的某行加上共享锁或者排他锁。意向锁的主要目的就是表明某人正在某行加锁,或者将要在某行加锁。 IS:意向共享锁,指事务将在表中的单个行上加共享锁。 IX:意向排他锁,指事务将在表中的单个行上加排他锁。 例如, SELECT … FOR SHARE 语句设置一个IS,SELECT … FOR UPDATE 设置一个IX。 意向锁协议如下: 1、事务在获取表中某行上面的共享锁之前,必须获得IS锁,或者IX锁。 2、事务在获取表中某行上面的排他锁之前,必须获得IX锁。 各锁之间的关系如下: 意向排他锁会阻止其他事务对表加上X锁或S锁。意向共享锁会阻止其他的事务加上X锁。 三、锁类型 记录锁

Mysql中的锁机制详解

删除回忆录丶 提交于 2020-01-11 14:33:11
原文: MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁) 作者: 唐大麦 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL锁机制 的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议。 Mysql用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。这些锁统称为悲观锁(Pessimistic Lock)。 MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。 表级锁: 开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁: 开销大,加锁慢;会出现死锁

Mysql中的锁

半腔热情 提交于 2020-01-06 18:25:00
1. 2 MySQL InnoDB 锁的基本类型 https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html 官网把锁分成了 8 类。所以我们把前面的两个行级别的锁(Shared and Exclusive Locks),和两个表级别的锁(Intention Locks)称为锁的基本模式。 后面三个 Record Locks、Gap Locks、Next-Key Locks,我们把它们叫做锁的算法, 也就是分别在什么情况下锁定什么范围。 2.1 锁的粒度 我们讲到 InnoDB 里面既有行级别的锁,又有表级别的锁,我们先来分析一下这两 种锁定粒度的一些差异。 表锁,顾名思义,是锁住一张表;行锁就是锁住表里面的一行数据。锁定粒度,表 锁肯定是大于行锁的。 那么加锁效率,表锁应该是大于行锁还是小于行锁呢?大于。为什么?表锁只需要 直接锁住这张表就行了,而行锁,还需要在表里面去检索这一行数据,所以表锁的加锁 效率更高。 第二个冲突的概率?表锁的冲突概率比行锁大,还是小? 大于,因为当我们锁住一张表的时候,其他任何一个事务都不能操作这张表。但是 我们锁住了表里面的一行数据的时候,其他的事务还可以来操作表里面的其他没有被锁 定的行,所以表锁的冲突概率更大。 表锁的冲突概率更大,所以并发性能更低,这里并发性能就是小于。 nnoDB

Mysql中的锁

柔情痞子 提交于 2020-01-05 23:51:28
1. 2 MySQL InnoDB 锁的基本类型 https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html 官网把锁分成了 8 类。所以我们把前面的两个行级别的锁(Shared and Exclusive Locks),和两个表级别的锁(Intention Locks)称为锁的基本模式。 后面三个 Record Locks、Gap Locks、Next-Key Locks,我们把它们叫做锁的算法, 也就是分别在什么情况下锁定什么范围。 2.1 锁的粒度 我们讲到 InnoDB 里面既有行级别的锁,又有表级别的锁,我们先来分析一下这两 种锁定粒度的一些差异。 表锁,顾名思义,是锁住一张表;行锁就是锁住表里面的一行数据。锁定粒度,表 锁肯定是大于行锁的。 那么加锁效率,表锁应该是大于行锁还是小于行锁呢?大于。为什么?表锁只需要 直接锁住这张表就行了,而行锁,还需要在表里面去检索这一行数据,所以表锁的加锁 效率更高。 第二个冲突的概率?表锁的冲突概率比行锁大,还是小? 大于,因为当我们锁住一张表的时候,其他任何一个事务都不能操作这张表。但是 我们锁住了表里面的一行数据的时候,其他的事务还可以来操作表里面的其他没有被锁 定的行,所以表锁的冲突概率更大。 表锁的冲突概率更大,所以并发性能更低,这里并发性能就是小于。 nnoDB

Mysql 数据库意向锁意义

允我心安 提交于 2020-01-01 04:16:27
锁:对 “某种范围” 的数据上 “某种锁” 1.“某种范围”:行、表 2.“某种锁” 2.1 共享锁Shared Locks(S锁) 1、兼容性:加了S锁的记录,允许其他事务再加S锁,不允许其他事务再加X锁 2、加锁方式:select…lock in share mode 2.2 排他锁Exclusive Locks(X锁) 1、兼容性:加了X锁的记录,不允许其他事务再加S锁或者X锁 2、加锁方式:select…for update 2.3 表锁:意向锁 Intention Locks,意向锁相互兼容 1、表明“某个事务正在某些行持有了锁、或该事务准备去持有锁” 2、意向锁的存在是为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存,。 3、例子:事务A修改user表的记录r,会给记录r上一把行级的排他锁(X),同时会给user表上一把意向排他锁(IX),这时事务B要给user表上一个表级的排他锁就会被阻塞。意向锁通过这种方式实现了行锁和表锁共存且满足事务隔离性的要求。 4、1)意向共享锁(IS锁):事务在请求S锁前,要先获得IS锁 2)意向排他锁(IX锁):事务在请求X锁前,要先获得IX锁 q1:为什么意向锁是表级锁呢? 当我们需要加一个排他锁时,需要根据意向锁去判断表中有没有数据行被锁定(行锁); (1)如果意向锁是行锁,则需要遍历每一行数据去确认; (2

MySQL自增锁

断了今生、忘了曾经 提交于 2019-12-25 03:15:25
最近在工作中遇到很多使用MySQL自带的autoincrement函数作为发号器,在实际使用中当并发比较小的时候还没有问题,一旦并发增加就会出现很多问题,特此进行如下总结。 一、自增配置 通过如下建表语句就可以完成自增的配置 CREATE TABLE `test_inc` ( `id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 二、修改自增大小 通过如下sql可以自动生成数字: insert into test_inc values(); 当增加3行后表中数据如下: +----+ | id | +----+ | 1 | | 2 | | 3 | +----+ CREATE TABLE `test_inc` ( `id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; 使用 alter table test_inc auto_increment=10;将自增修改成10后再次插入的数据为10. +----+ | id | +----+ | 1 | | 2 | | 3 | | 10 | |

mysql数据库锁的机制-one

本秂侑毒 提交于 2019-12-17 18:07:49
锁概念 : 当高并发访问同一个资源时,可能会导致数据不一致,需要一种机制将用户访问数据的顺序进行规范化,以保证数据库数据的一致性。锁就是其中的一种机制。 举例 :以买火车票为例,火车票可面向广大消费者,每位用户都可以查询余票数量、购买火车票 ... 但最终购票成功的仅有一位用户,处于购票高峰期时会出现很多用户同时抢夺同一张票的现状,为了避免出现一张火车票被多个用户购买成功的情况,当第一位用户进入购票流程时,就将数据库锁定,让别的用户无法修改,只有当第一位用户购票成功或取消购票之后,才会解除数据库的锁定,此时别的用户就可继续进行操作。这样就保证了一张火车票只能被一个用户购买。 悲观锁: 一般代指 数据库锁机制, 类似于我们在多线程资源竞争时添加的互斥锁,较容易出现死锁现象。它对于数据被外界修改持保守态度, 认为数据随时会修改,所以整个数据处理中需要将数据加锁。 悲观锁一般都是依靠关系数据库提供的锁机制实现。 悲观锁按使用性质划分: 数据库的操作可归纳为两种:读和写。当多个事务同时读取一个对象时,不会产生有冲突。但同时读和写,或者同时写会产生冲突。因此为提高数据库的并发性能,定义三种锁 共享锁( Share locks简记为S锁 ) :也称 读锁 ,事务A给对象T加S锁, 其他事务也只能对T加S , 多个事务可以同时读,但不能有写操作 ,直到A释放S锁。     地球语言 :

排查MySQL事务没有提交导致 锁等待 Lock wait timeout exceeded

喜你入骨 提交于 2019-12-17 00:30:26
解决思路:   select * from information_schema.innodb_trx 之后找到了一个一直没有提交的只读事务,   kill 到了对应的线程后ok 了。 转载自:http://blog.sina.com.cn/s/blog_6bb63c9e0100s7cb.html 在Mysql5.5中,information_schema 库中增加了三个关于锁的表(MEMORY引擎);   innodb_trx ## 当前运行的所有事务   innodb_locks ## 当前出现的锁   innodb_lock_waits ## 锁等待的对应关系 ## 产生事务,在innodb_trx就有数据 ; mysql> select * from information_schema.innodb_trx G; 如果没有产生锁等待,innodb_lock_waits 和innodb_locks 中没有数据 如果产生所等待,查询这三张表,找到对应线程,杀掉。 来源: https://www.cnblogs.com/luffe/p/7977592.html