上篇说到数据库事务中的特性ACID和4个隔离级别,今儿就来看一下事务中的锁。
MySQL中的锁锁是MySQL在服务器层和存储引擎层的并发控制,锁可以保证数据并发访问的一致性、有效性;
锁冲突也是影响数据库并发访问性能的一个重要因素
MySQL有三种级别的锁:「表级锁、行级锁、页级锁」
表级锁行级锁业级锁特点开销小、加锁快开销大、加锁慢加锁时间介于其余两者之间是否会死锁否是是并发度粒度大、锁冲突概率最高、并发低粒度小、锁冲突概率低、并发高粒度介于其余两者之间、并发一般存储引擎Innodb、MyISAMInnodbBDB
「术语:」
DDL,Data Definition Language,数据库定义语言
比如:CREATE,ALERT,DROP,TRUNCATE
DML,Data Manipulation Language,数据库操作语言
比如:SELECT,INSERT,UPDATE,DELETE,CALL,EXPLAIN PLAN,LOCK
DCL,Data Control Language,数据库控制语言
比如:COMMIT,SAVEPOINT,ROLLBACK,SET TRANSACTION
Innodb中的锁表锁和行锁
表锁
Innodb有两种内部使用的意向锁(Intention Locks),都是表锁。
表锁分成三种:
「意向共享锁(IS):」
事务计划给数据行加行共享锁,加共享锁之前必先获取该锁
「意向排他锁(IX):」
事务打算给数据行加行排他锁,加排他锁之前必先获取该锁
「自增锁(AUTO-INC Locks):」
特殊表锁,自增长计数器通过该“锁”来获得子增长计数器最大的计数值。
在加行锁之前必须先获得表级意向锁,否则等待 innodb_lock_wait_timeout 超时后根据innodb_rollback_on_timeout 决定是否回滚事务。
如何添加表锁
lock tables table_name read/write「释放锁:」
释放锁不需要添加参数,其会释放当前用户的所有锁。
unlock tables「例如:」
1、给student表添加读锁,看当前用户和其他用户是否能插入数据: