表锁
对于整个表而言,偏向myisam存储引擎,开销小,加锁快,无死锁,并发性不太好。偏向于读。 set autocommit=0,这是针对一张表而言的
读锁
- 读锁操作命令: LOCK TABLE
userread - 解锁操作命令:UNLOCK TABLES
- 查看表锁:SHOW OPEN TABLES LIKE "%user%"
- 特点:对表加锁后,当前查询对表有读的权限,没有写的权限,对其他表没有读写权限,其他 查询对表有读的权限,写会等待解锁后再执行完毕。
写锁
- 读锁操作命令: LOCK TABLE
userwrite - 解锁操作命令:UNLOCK TABLES
- 查看表锁:SHOW OPEN TABLES LIKE "%user%"
- 特点:对表加锁后,当前查询对表有读写的权限,对其他表没有读写权限,其他 查询对表没有读的权限,写会等待解锁后再执行完毕。
总结表锁
读锁会阻塞写操作,写锁会阻塞读写操作
行锁
对于行锁而言,使用innodb存储引擎
- 对于不同行的操作是无关联的,而当操作同一条的数据时,会阻塞后面查询的写权限,直到前面的数据提交。在一次查询未提交时,当前查询可以看到数据的变化。而其他的查询只能看到之前的数据,并且它的写权限也被阻塞了
- 自动加锁:select * from user where id =0 for update,在提交之前,其他查询访问这条数据时,会阻塞