mysql学习笔记之锁

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

类型

  1. MyISAM 和 Memory 存储引擎使用的是表级锁,BDB 引擎使用的是页级锁,也支持表级锁。
  2. InnoDB 存储引擎既支持行级锁,也支持表级锁,默认情况下使用行级锁。
  3. 所谓表级锁,它直接锁住的是一个表,开销小,加锁快,不会出现死锁的情况,锁定粒度大,发生锁冲突的概率更高,并发度最低。
  4. 所谓行级锁,它直接锁住的是一条记录,开销大,加锁慢,发生锁冲突的概率较低,并发度很高。
  5. 所谓页级锁,它是锁住的一个页面,在 InnoDB 中一个页面为16KB,它的开销介于表级锁和行级锁中间,也可能会出现死锁,锁定粒度也介于表级锁和行级锁中间,并发度也介于表级锁和行级锁中间。
  6. 仅仅从锁的角度来说,表级锁更加适合于以查询为主的应用,只有少量按照索引条件更新数据的应用
  7. 行级锁更适合大量按照索引条件并发更新少量不同的数据,同时还有并发查询的应用

InnoDB有两种类型的行级锁,两种内部使用的意向锁;

 

锁一般运用在事务中。锁是在“原子”中生效,如果这个“原子”运行结束或者释放了,那么这个锁也会被释放。被事务包裹起来的也是一个“原子”。

加锁需要通过索引来加锁,否则会升级为表锁

在MySql的写语句中,给表列赋值与表类型不符合时,MySql底层的优化器发挥作用,会做一个强制类型转化,此时能正常操作,但会导致行锁升级为表锁

意向锁是InnoDB存储引擎自动加的,对于普通select语句,InnoDB不会加任何锁,对于insert,update,delete语句,InnoDB会自动改涉及的数据加排他锁,InnoDB以通过以下语句显示添加的共享锁和排他锁。

共享锁语句

select * from table_name lock in share mode;

排他锁语句

select * from table_name for update;

如果PHP一个处理联系数据库后创建一个事务,如果在这个事务里没有进行回滚或者提交直接关闭了链接,这时候锁是会被释放的,事务默认没有提交,不过这个事务占用的资源不知道会不会被释放

innodb也是可以对于好几行进行加锁的

 

死锁情况

A

BEGIN; 执行步骤1
select * from ia_account where account_id =300006 lock  in SHARE MODE; 执行步骤2
select * from ia_account where account_id =300006 for update;执行步骤5 这个时候需要等待事务B释放共享锁

B

BEGIN; 执行步骤3
select * from ia_account where account_id =300006 lock  in SHARE MODE;执行步骤4
select * from ia_account where account_id =300006 for update;执行步骤6 这个时候需要等待事务A释放共享锁 发生死锁  一个事务抛出错误(哪个事务抛出由mysql决定)

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看