`

mysql 锁的认知

 
阅读更多

mysql锁的问题

     1.myisam和memory采取表锁,innodb支持表锁和行锁,但默认使用行锁

 

     2.表锁:开销小,加锁快,不会出现死锁,锁粒度大,发生锁冲突的概率最高,并发度最低。而行锁完全相反

 

     3.myisam的表锁:

       3.1 使用 show status like 'table_%',如果 table_locks_waited(表示不能立即获取锁的查询次数)的值比较高,则表示表锁争用情况比较严重

 

       3.2 表锁分为:读锁和写锁,一般来说myisam的读写是串行的

           1.其中,如果一个线程活动读锁,其他线程只能“读取”表而不能进行其他操作

  2.如果获取的是写锁,则会阻塞其他线程的读写操作,直到锁被释放

  3.某线程加了读锁或写锁的情况下,该线程无法读取操作任何其他未加锁的表

  4.myisam对表进行select时候自动加读锁,进行insert、update、delete等自动加写锁

  5.myisam会一次性获取sql所需要的全部锁,这就是不会出现死锁的原因

  6.sql语句中使用了表别名,如果使用显示加锁的语句,需要在加锁语句中也对表进行别名加锁,例如:lock table bi_user as u read, bi_role as r read;

           

       

       3.3 myisam的读插并发,对于读写锁都是不允许另一个线程进行“插入”操作的,通过设置系统变量concurrent_insert来允许读插并发:

           concurrent_insert设置为0时,不允许并发插入

  concurrent_insert设置为1时,如果被锁表中没有空洞(即中没有被删除的行),允许令一线程对锁表从尾部插入数据,mysql默认的设置

  concurrent_insert设置为2时,无论有没有空洞,都允许对锁表尾部插入数据

 

      

 

 

 

  • 大小: 408.4 KB
  • 大小: 141.5 KB
  • 大小: 189.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics