MySQL中的锁

MySQL中的锁

按兼容度分

  1. 排他锁

又称S锁,排他锁主要用于写操作,如更新或删除,它阻止其他事务对数据进行访问。 只有一个事务可以获得排他锁,其他事务无法获得任何类型的锁,直到该事务释放排他锁。 排他锁的目的是确保在写操作完成前,数据不会被其他事务读取或修改,从而保持数据的完整性和一致性。

  1. 共享锁

又称X锁,共享锁主要用于读操作,允许事务对数据进行读取。 多个事务可以同时对同一数据对象加共享锁,进行读取操作。 共享锁的目的是允许并发读取,但阻止其他事务对数据对象加排他锁,从而阻止写操作。

按颗粒度分

  1. 表锁

锁定整个表,当一个事务对表进行锁定时候,其他事务不能访问该表。死锁风险大。

  1. 行锁

锁定一行数据,当一个事务对改行数据进行锁定时候,其他事务可以访问除了该行的其行。死锁风险小。
行锁还是表锁是根据索引来的,如果用到索引就是行锁,没用到就是表锁

按锁的模式分

  1. 意向锁

它是一个标志,解决行锁和表锁共存委托,用来表示表是否加了锁,所以是一种表锁。加入当要加一个表锁时,要判断每一行是否加了锁,有了意向锁后,就可以不用遍历每一行就能知道有没有其他锁,用来提高效率。

  1. 记录锁

直接锁定某行数据,如:select * from table where id = ‘1’ for update 或者 select * from table where id =1 lock in share mode;

  1. 间隙锁

间隙锁是数据库中用于锁定索引范围的一种锁。它们的主要目的是防止其他事务在给定范围内插入新的数据,保证范围内数据的一致性和避免幻读现象,如SELECT * FROM table WHERE id BETWEEN 10 AND 20 FOR UPDATE;。这个查询会获取范围在 10 到 20 之间的数据行,并且对这个范围的间隙(即 9 到 21 之间的索引空间)也会加上间隙锁,防止其他事务在这个范围内插入新的数据行。

  1. 临键锁

临键锁同时锁定索引记录本身及其后面的间隙,而间隙锁仅锁定索引记录之间的间隙,不包括索引记录本身

按锁的机制分

  1. 乐观锁

乐观锁假设并发冲突不会频繁发生,因此在数据处理时不会直接锁定数据。它只在更新数据时检查是否有其他线程修改过数据,如果其他线程没有修改过数据,则认为没有发生并发冲突,操作可以执行。乐观锁的常见实现方式包括使用版本号机制或CAS(Compare-and-Swap)操作。乐观锁适用于读多写少的场景,因为它不会阻塞其他线程的访问,从而提高了系统的吞吐量.

  1. 悲观锁

悲观锁则与乐观锁相反,它假设最坏的情况会发生,即认为并发冲突会频繁发生。因此,悲观锁在操作数据时会直接锁定数据,以避免其他线程进行操作。悲观锁的常见实现方式包括使用数据库的行锁、表锁、读锁、写锁等,以及Java中的synchronized关键字或Lock接口的实现类(如ReentrantLock)等。悲观锁适用于写操作比较频繁的场景,因为它可以确保数据的一致性,但可能会牺牲一部分性能。

总结:

乐观锁和悲观锁是两种不同的并发控制策略,它们在处理并发访问共享资源时的行为和适用场景上有所不同。
总结来说,乐观锁和悲观锁的主要区别在于它们对并发冲突的假设和处理方式不同。乐观锁假设并发冲突不会频繁发生,通过在更新时检查数据是否被其他线程修改来避免冲突;而悲观锁则假设并发冲突会频繁发生,通过在操作数据时直接锁定数据来避免冲突。因此,选择哪种锁策略应根据具体的应用场景和需求来决定.

死锁问题

导致原因:

  1. 并发操作:多个事务同时对同一组资源进行写操作。
  2. 不同顺序:每个事务按不同的顺序锁定资源。
  3. 无法撤销:事务执行后无法回滚,必须完成或者产生死锁。

解决方案:

  1. 避免事务过大:将大事务拆分成多个小事务。
  2. 优化索引:确保查询有有效的索引,减少锁定的行数。
  3. 锁粒度:减少锁定资源的数量,例如通过锁定更少的行。
  4. 事务隔离级别:降低事务隔离级别可以减少死锁的几率,但需要权衡其他并发问题。
  5. 超时和重试机制:设置事务的超时时间,超时后自动回滚,并可以重试事务。
  6. 检测和解除死锁:通过数据库提供的工具和机制检测死锁,并主动解除。
  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值