MYSQL锁

Mysql 有哪些锁?

首先是全局锁 : 全局锁,这主要是做全局备份的时候使用的,在可重复读的情况下可以通过readandview 进行备份

然后是表级锁:

  1. 表锁对整张表进行加锁。
  2. 元数据锁(MDL)对表结构进行加锁,在进行CRUD操作时,需要获取MDL读锁,在进行表结构修改时需要获取MDL写锁。
  3. 意向锁,意向锁的目的是为了快速判断表里是否有记录被加锁。假如说表里面有意向锁,就说明有人要进行对于的读或者写的操作。(对应大楼门口的施工警示牌),它不会和行级锁发生冲突。
  4. AUTO-INC 锁,这个主键自增锁,每次插入记录时,都要获取这个表的AUTO_INC锁。AUTO-INC 锁是特殊的表锁机制,锁不是再一个事务提交后才释放,而是再执行完插入语句后就会立即释放

行级锁:

  1. Record Lock 记录锁,也有 X锁跟S锁之分,锁的是索引
  2. Gap Lock 间隙锁,锁一个间隙,其他线程不可以对这个间隙范围机进行增删的操作。
  3. Next-Key Lock : 临间锁, 使用 Record Lock + Gap Lock ,锁定一个范围同时又锁定记录本身,
  4. 插入意向锁:配合 Gap Lock 使用,当要插入的位置上了Gap Lock 时,会阻塞。

MySQL 是怎样加锁的?

普通的 select 语句是不会对记录加锁的(除了串行化隔离级别),因为它属于快照读,是通过 MVCC(多版本并发控制)实现的。

如果要在select 语句进行加锁,可以使用 lock in share lock 或者 for update 进行锁定读,

update 和 deleted 都会加上行级的X锁。

加锁的对象是索引,加锁的基本单位是 next-key lock,它是由记录锁和间隙锁组合而成的,next-key lock 是前开后闭区间,而间隙锁是前开后开区间

在能使用记录锁或者间隙锁就能避免幻读现象的场景下, next-key lock 就会退化成记录锁或间隙锁

Mysql死锁了怎么办?

死锁的原因:死锁的话是由于两个事务锁住了同一个范围,都要进行插入操作,都在等待对方释放锁。

如何避免死锁: 设置策略,超时回滚。死锁检查,自动回滚一条。

mysql怎么查看锁表的情况?

select * from performance_schema.data_locks\G;

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值