• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
CaoJianbang
邦哥
博客园    首页    新随笔    联系   管理    订阅  订阅

锁机制

悲观锁

1,读锁/共享锁  lock table t read

自己:能读,不能写

别人:能读,写等待

2,写锁/排它锁  lock table t write

自己:能读,能写

别人:读等待

 

解锁:unlock tables

 

select 自动加读锁

update,delete,insert 自动加表锁

 

粒度:

mysiam:表锁

innodb:有索引行锁,没有索引表锁

 

乐观锁

update set num = num-1 where id = 1 and num > 0

 

 

 

读锁/共享锁:lock in share mode

  别人可读,不可写

写锁/排他锁:for update

  别的不可读,也不可写,处于等待中,update,del,insert都会自动添加排他锁

 

乐观锁:本身没有加锁

  通过版本控制实现:update user set age= 25, version = version + 1 where id = 1 and version = 0   

悲观锁:加锁操作 lock,for update,lock in share mode,还有行锁,表锁等

 

死锁:

事务A
update user set age = 21 where id = 1
update user set age = 22 where id = 2

事务B
update user set age = 21 where id = 2
update user set age = 22 where id = 1

事务A跟事务B都执行了第一句,执行第二局的时候,都被对方锁定而处于等待中

解决方案:回滚其中一个事务,超时就回滚

 

show engine innodb status 查看最近的死锁

innoDB Lock monitor 控制台打开锁监控,比较浩性能

innodblockwait_timeout 设置死锁回滚超时

 

posted @ 2022-10-31 17:41  CaoJianbang  阅读(32)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3