数据库为什么会有锁?
- 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。
- 为了保证数据的一致性。mysql数据库存在多种数据引擎,MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。
表级锁(table-level)
(表级锁一次会将整个表锁定,所可以很好的避免死锁问题)
(1)锁定粒度大,锁冲突概率高、并发度低;
(2)好处是不会出现死锁、开销小、获取锁和释放锁的速度很快;
(3)使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎,适用于以查询为主,少量更新的应用。
行级锁(row-level)
(1)好处是锁定对象的颗粒度很小,发生锁冲突的概率低、并发度高;
(2)缺点是开销大、加锁慢,行级锁容易发生死锁;
(3)使用行级锁定的主要是InnoDB存储引擎、及分布式存储引擎NDBCluster等。适用于对事务完整性要求较高的系统。InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁。
页级锁(page-level)
- 页级锁定是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。
在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升。
锁的类型
(1)共享锁:又称读锁,简单讲就是多个事务对同一数据进行共享一把锁,都能访问到数据,但是只能读不能修改。
(2)排他锁:又称写锁,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,只有获取排他锁的事务可以对数据进行读取和修改。
(3)意向锁是InnoDB自动加的,不需用户干预。意向锁不会与行级的共享 / 排他锁互斥!!!
什么时候会释放锁?
提交事务或回滚事务就会释放锁。