携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
一、锁作用定义
- 锁机制用来管理对共享资源的并发访问。
- InnoDB 储存引擎的锁会在行级上对表数据上锁,除此之外还会对 LRU 列表中的删除、添加、移动行为上锁。
- 在数据库系统中使用锁能够支持了对共享资源的并发访问,以此提供了数据的完整性和一致性。
二、lock 锁与 latch 锁
latch 锁是轻量级的锁,要求锁定的时间很短。若持续时间长就会造成性能很差的后果。- latch 包括 mutex (互斥量)和 rwlock (读写锁),通过这些设置,保证了并发线程操作临界资源的正确性,所以一般没有死锁检测机制。
- lock 对象是事务,可见这是用来锁定数据库中的对象(表、页、列)。lock 的对象一般在事务 commit 或 rollback 后释放。
三、行级锁
- InnoDB 行级锁包括两种:共享锁、排他锁。
共享锁 (S Lock)即允许事务读一行数据。两个及以上事务都可以对行 r 上锁并读取数据,称为锁兼容。排他锁 (X Lock)即允许事务删除或更新一行数据。只允许一个事务对行 r 上锁并修改数据。- S 锁和 X 锁都是行锁,所以兼容是指对同一行记录锁的兼容性状况。
- 还有一种称为意向锁的锁方式,即将锁的对象分为多个层次,并希望在更细粒度上进行加锁,如上图。
- 意向锁包括:意向共享锁、意向排他锁。
意向共享锁 IS Lock即事务想要获得一张表中的某几行的共享锁。意向排他锁 IX Lock即事务想要获得一张表中的某几行的排他锁,兼容性如下。
四、自增长与锁
- 自增长是数据库常见属性,每个自增长值表都有自增长计数器,可以通过执行以下语句进行初始化。
select max(auto_inc_col) from t for update;
- 这种锁称为 AUTO-INC Locking,采用了一种特殊的锁机制:在完成对自增长插入的 SQL 语句后立即释放,而不是在事务完成后才释放。以此提高了插入的性能。此方法虽然提高了并发插入效率,但是对有自增长的列并发插入效率没有帮助,因为他必须要等待前一个插入的完成。当有大量数据插入时也会影响性能,因为有事务会被阻塞。
五、外键与锁
- 外键主要作用于引用完整性和约束检查。InnoDB 会自动给外键列添加一个索引,这样就可以避免表锁了。