读写锁

来源:互联网 发布:oracle数据培训 编辑:程序博客网 时间:2024/06/06 09:58
myisam:
读锁:
所有会话能进行读,不能进行 insert, update, delete ,别的会话等待。
当前会话 unlock table 的时候,别的会话可以进行 insert,update,delete 。

写锁:
只有当前会话可以进行 insert, update, delete, select .别的会话等待

读锁获取需要对别名也进行读锁获取
lock table actor as a read, actor as b read;


innodb:
select ... in share mode
两个会话都对一条记录进行 select xxx from actor where actor_id = 178 lock in share mode,此时只有一个会话可以对此条记录进行 修改,其他的会话修改会报错并退出共享锁模式,第一个修改记录的会话获得锁,并更新

select ... for update
只有一个会话可以进行 for update 共享锁的获得,其他会话想要获得得先等待,当第一个会话 更新后释放该 update 锁,其他会话获得该 update 锁


innodb 
1)只有通过索引条件检索数据,innodb 才使用行级锁,否则, innodb 将使用表锁


2)由于 mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。也就是同一个索引不能针对多条记录

3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引,唯一索引或普通索引,innodb 都会使用行锁对数据加锁

4)即便在条件中使用了索引字段,但是否使用索引来检索数据是由 mysql 通过判断不同执行计划的代价来决定的,如果 mysql 认为全表扫描效率更高,比如对一些很小的表,他就不会使用索引,这种情况下 innodb 将使用表锁,而不是行锁。




















0 0