锁的介绍
- 锁机制: 数据库为了保证数据的一致性,在共享的资源被并发访问时变得安全所设计的一种规则
- 锁机制类似多线程中的同步,作用就可以保证数据的一致性和安全性
- 按操作类型分类
共享锁: 也就读锁,针对同一份数据,多个事务读取操作可以同时加锁而不互相影响,但是不能修改数据
排它锁: 也叫写锁,当前的操作没完成之前,会阻断其他操作的读取和写入操作- 按粒度分类
表级锁: 会锁定整个表,开销小,加锁快,锁定粒度大,发生锁冲突概率高,并发度低,不会出现死锁情况
行级锁: 会锁定当前行,开销大,加锁慢.锁定粒度小,发生锁冲突概率低,并发度高,会出现死锁情况- 按使用方式分类
悲观锁: 每次查询数据时都会认为别人会修改,很悲观,所以查询时加锁
乐观锁: 每次查询时都认为别人不会修改,很乐观,但是更新时会判断一下在此期间时别人有没有取更新这个数据不同存储引擎支持的锁
不同存储引擎支持的锁
InnoDB 共享锁
- 共享锁特点
数据可以别多个事务查询,但是不能被修改- 创建共享锁格式
SELECT 语句 LOCK IN SHARE MODE
InnoDB 排它锁
- 排它锁特点
加锁的数据,不能被其他事务加锁查询或修改- 创建排它锁格式
SELECT 语句 FOR UPDATE;
myisam 读锁
- 读锁特点
所有链接只能查询数据,不能修改- 读锁语法格式
加锁:LOCK TABLE 表名 READ;
解锁:```UNLOCK TABLES;
myisam 写锁
- 写锁特点
其他链接不能查询和修改数据- 写锁语法格式
加锁:LOCK TABLE 表名 WRITE;
解锁:UNLOCK TABLES;
悲观锁和乐观锁
- 悲观锁
就是很悲观,它对于数据被外界修改的操作持保守态度,认为数据随时会修改。整个数据处理中需要将数据加锁。悲观锁一般都是依靠关系型数据库提供的锁机制。我们之前所学的锁机制都是悲观锁。- 乐观锁
就是很乐观,每次自己操作数据的时候认为没有人会来修改它,所以不去加锁。但是在更新的时候会去判断在此期间数据有没有被修改。需要用户自己去实现,不会发生并发抢占资源,只有在提交操作的时候检查是否违反数据完整性。