MyISAM 和 InnoDB 锁总结

为什么要用锁?

你在试衣间试衣服,没有锁,别人就会推门进来,场面会很尴尬!!!

什么是锁?

  1. 锁是计算机协调多个进程或线程并发访问某一资源的机制;
  2. 在数据库中,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素;
  3. 锁对数据库而言显得尤其重要,也更加复杂。

Mysql 中的锁?

  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
  • 页锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

锁的使用场景?

  • 表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,可以考虑使用MyISAM锁;
  • 行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,可以考虑使用InnoDB锁.

MyISAM 锁-- 表级锁

MySQL 的表级锁有两种模式:

  • 表共享读锁(Table Read Lock)
  • 表独占写锁(Table Write Lock)
 None(无锁时)读锁写锁
读锁
写锁

 

 读锁写锁
同session

读当前被锁表:可读

读当前被锁表别名表: 报错

写当前被锁表:报错

读其他表:报错

写其他表:报错

读当前被锁表:报错

读当前被锁表别名表: 报错

写当前被锁表:可写

读其他表:报错

写其他表:报错

不同session

读当前被锁表:可读

写当前被锁表:等待

读其他表:可读

写其他表:可写

读当前被锁表:等待

写当前被锁表:等待

读其他表:可读

写其他表:可写

InnoDB 锁--行级锁

注:必须有索引才能实现,否则会自动锁全表!!!

 读锁写锁
同session

可读

可写

id= 1加写锁

不同session

可读

允许读

写id= 1的数据,等待

写id != 1的数据,可写

写 非索引列查询条件数据,等待

加锁

可加读锁

不可加任何锁

 

如何释放锁?

执行Begin,commit,或者rollback

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值