MYSQL锁

Posted 去糖不加冰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL锁相关的知识,希望对你有一定的参考价值。

1.锁的定义

我们在操作数据库的时候,可能会由于并发问题而引起数据的不一致(数据冲突),锁的冲突也是影响数据库并发访问性能的一个重要因素,锁对于数据库而言就显得尤其重要
mysql的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。
比如:
MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);
innoDB存储引擎即支持行级锁(row-level locking),也支持表级锁,默认情况下是采用行级锁

表级锁:
开销小,加锁快;不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁);锁定力度大,发生锁冲突的概率最高,并发度最低。
应用场景:并发性不高,以查询为主,少量更新的应用,比如小型的web应用
行级锁:
开销大,加锁慢;会出现死锁;锁定力度最小,发生锁冲突的概率最低,并发度也最高。
应用场景:适用于高并发环境下,对事务完整性要求较高的系统,如在线事务处理系统
页锁:
开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定力度介于表锁和行锁之间,并发度一般

其他
悲观锁和乐观锁
悲观锁
就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都 会上锁
乐观锁
就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁
共享锁
共享锁指的就是对于多个不同的事务,对同一个资源共享同一个锁。相当于对于同一扇门,它拥有多个钥
匙一样,共享锁在mysql中是通过 什么命令来调用呢。在执行语句后面加上lock in share mode就代表对某些资源加上共享锁了。

2.MYISAM引擎

表锁有两种模式:表共享锁(Table Read Lock) 和表独占写锁(Table Write Lock).
1.对MyISAM的读操作,不会阻塞其他用户对同一表请求,但会阻塞对同一表的写请求;
2.对MyISAM的写操作,则会阻塞其他用户对同一表的读和写操作;
3.MyISAM表的读操作和写操作之间,以及写操作之间是串行的。

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

3.INNODB引擎

innoDB的行锁模式及加锁方法
innoDB有两种类型的行锁
1.共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集得排他锁。
2.排他锁(X):允许获取排他锁得事务更新数据,阻止其他事务取得相同得数据集共享读锁和排他写锁。

另外,为了允许行锁和表锁共存,实现多颗粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁
1.意向共享锁(IS):事务打算给数据行共享锁,事务在给一个数据行加共享锁必须先取得该表的IS锁。
2.意向排他锁(IX):事务打算给数据行加排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。

以上是关于MYSQL锁的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 进阶 锁 -- MySQL锁概述MySQL锁的分类:全局锁(数据备份)表级锁(表共享读锁表独占写锁元数据锁意向锁)行级锁(行锁间隙锁临键锁)

mysql插入意向锁测试

关于mysql 共享锁和排他锁 互斥问题?

怎么给mysql加排他锁

Mysql加锁过程详解-基本知识

浅谈Mysql共享锁排他锁悲观锁乐观锁及其使用场景