mysql 锁住一行数据_MySQL-锁

锁的由来

我们需要最大程度地利用数据库的并发访问,还需要确保每个用户以一致性的方式读取和修改数据,为解决此问题,有了锁的机制

InnoDB 存储引擎相对比MySQL 数据库的其他存储引擎在这方面要技高一筹

MySQL 常用引擎:InnoDB、MyISAM、Memory

锁机制用于管理对共享资源的并发访问,为了保证数据一致性和完整性,必须要有锁的介入

MySQL InnoDB 锁的基本类型

有两个概念的锁lock 和latch,这里着重聊聊lock 锁

latch 轻量级的锁,因为其要求锁定的时间必须非常短,如果持续的时间长,则应用的性能会非常差。在InnoDB 引擎中,latch 可以分为mutex(互斥)和rwlock(读写锁)。用来保证并发线程操作临界资源的正确性,并且没有死锁检测的机制

lock 的对象是事务,用来锁定数据库中的对象,如表、页、行。lock 是在事务commit 或rollback 后进行释放

在InnoDB 存储引擎中的latch,可以通过命令来进行查看

show ENGINE INNODB MUTEX;

MySQL InnoDB 锁的基本类型

两个行级别的锁(Shared and Exclusive Locks)和两个表级别的锁(Intention Locks)称为锁的基本模式

后面三个 Record Locks、Gap Locks、Next-Key Locks,我们把它们叫做锁的算法

锁的粒度

在InnoDB 里面既有行级别的锁,又有表级别的锁,来看下两者的区别

表锁:锁住一张表

行锁:锁住表里面的一行数据

锁定粒度,表锁肯定是大于行锁。另外,表锁的加锁效率要比行锁效率更高

共享锁

第一个行级别的锁shared locks(共享锁),获取一行数据的读锁以后,可以用来读取数据,所以它也叫做读锁,不要在加上了读锁以后去写数据,容易出现死锁的情况。

通过: select .... lock in share mode; 手工加上一把锁

共享锁是可以重复获取的,通过以下sql 可以进行验证

释放锁有两种方式,只要事务结束,锁就会自动释放,包括提交事务和结束事务

拍它锁

第二个级别的锁叫做Exclusive Locks(排它锁),用来操作数据又称写锁

排它锁加锁的方式

1)自动加排它锁。在操作数据的时候,包括增删改,都会默认加上一把排它锁

2)手工加锁,用一个FOR UPDATE 给一行数据加上一把排它锁

以上是两个行锁,接下来是两个表锁

意向锁

这把锁是由数据库自己维护的,我们在给一行数据加上共享锁之前,数据库会自动在这张表上面加一把意向共享锁;当我们给一行数据加上排他锁之前,数据库会自动在这张表上面加一个意向排他锁

这两把锁存在意义何在?

1)有了表级别的锁,在InnoDB 里面就可以支持更多粒度的锁

2)加表锁前可以不必去扫描整张表,只需要判断这张表上面有没有意向锁,如果有,就直接返回失败,没有的话,就可以加锁成功

在InnoDB 里的表锁,可以理解成一个标志

以上就是MySQL 4种基本锁的模式

锁的原理

锁住是什么?思考过吗?

是索引,锁是通过索引来实现的

场景:如果表中没有索引的时候,锁住一行数据会导致什么情况?一张表中可能会没有索引吗?

1)如果定义了主键(PRIMARY KEY) ,InnoDB 会选择主键作为聚集索引

2) 如果没有显示定义主键,InnoDB 会选择第一个不包含有 NULL 值的唯一索

引作为主键索引

3)如果也没有这样的唯一索引,则 InnoDB会选择内置6字节长的ROWID作为隐藏的聚集索引,它会随着行记录的写入而主键递增

先写到这里,后续会继续此篇内容,为故而知新

你可能感兴趣的:(mysql,锁住一行数据)