索引
全局锁
全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
对于不支持事务的引擎,要想获得全库一致性视图只能靠这个。
表锁
表锁的语法是 lock tables … read/write。读锁之间不互斥,读写之间、写写之间互斥。
另一类表级的锁是 MDL(metadata lock)。MDL 不需要显式使用,在访问一个表的时候会被自动加上。在 MySQL 5.5 版本中引入了 MDL,当对一个表做增删改查操作的时候,加 MDL 读锁;当要对表做结构变更操作的时候,加 MDL 写锁。互斥性与普通表锁一致。
行锁
MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁。
在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。
根据两阶段锁协议,不论你怎样安排语句顺序,所有的操作需要的行锁都是在事务提交的时候才释放的。所以应该把对竞争度最大的资源的加锁操作放在事务最后,可以有效减少锁竞争。因为资源被锁住的时间变短了!
即:innodb在进入事务在访问数据时自动加行锁,事务提交时释放锁。
原创文章,作者:geekgao,如若转载,请注明出处:https://www.geekgao.cn/archives/2736