mysq之使用锁

 锁分类

  1. 从性能上分为乐观锁(用版本对比来实现)和悲观锁
  2. 从对数据库操作的类型分,分为读锁和写锁(都属于悲观锁)
    1. 读锁(共享锁,S锁(Shared)):针对同一份数据,多个读操作可以同时进行而不会互相影响
    2. 写锁(排它锁,X锁(eXclusive)):当前写操作没有完成前,它会阻断其他写锁和读锁
  3. 从对数据操作的粒度分,分为表锁和行锁

 表锁

每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;一般用在整表数据迁移的场景。

#手动增加表锁

lock table 表名称 read(write),表名称2 read(write);

#查看表上加过的锁

show open tables;

#删除表锁

unlock tables;

 

总结:

MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行update、insert、delete操作会自动给涉及的表加写锁。

InnoDB在执行查询语句SELECT时(非串行隔离级别),不会加锁。但是update、insert、delete操作会加行锁。

简而言之,就是读锁会阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞。

行锁

每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。

行锁演示
一个session开启事务更新不提交,另一个session更新同一条记录会阻塞,更新不同记录不会阻塞
 

#比如开启两个sql窗口,手动修改同一条记录,第一个不提交,第二个进行提交

无索引行锁会升级为表锁

锁主要是加在索引上,如果对非索引字段更新,行锁可能会变表锁
session1 执行:update account set balance = 800 where name = 'lilei';
session2 对该表任一行操作都会阻塞住
InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为
表锁。

锁定某一行还可以用lock in share mode(共享锁) 和for update(排它锁)

例如:
select * from test_innodb_lock where a = 2 for update; 
这样其他session只能读这行数据,修改则会被阻塞,直到锁定行的session提交

 

 ‐‐ 查看事务
 select * from INFORMATION_SCHEMA.INNODB_TRX;

 ‐‐ 查看锁
 select * from INFORMATION_SCHEMA.INNODB_LOCKS;

 ‐‐ 查看锁等待
 select * from INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

 ‐‐ 释放锁,trx_mysql_thread_id可以从INNODB_TRX表里查看到
 kill trx_mysql_thread_id

 ‐‐ 查看锁等待详细信息
 show engine innodb status\G;

 --查看mysql线程运行情况(可以查询是否锁表)
 show processlist;

注:以上为本人总结,如有错误之处,望不吝指出,非常感谢!

如果对您起到了一点点帮助,请给予我一点鼓励,在下方点个小小的赞,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值