MySQL锁机制

本文详细介绍了MySQL的锁机制,包括表级锁和行级锁。表级锁分为读锁和写锁,适用于并发不高的场景。行级锁则分为共享锁和排他锁,提供更高的并发度。InnoDB存储引擎支持事务和行级锁,有效降低了锁冲突。同时,文章还探讨了死锁问题和乐观锁、悲观锁的概念。
摘要由CSDN通过智能技术生成

一、MySQL锁概述

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低,又分读锁与写锁。 

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高,又分共享锁与排他锁。 

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般 

MySQL的锁机制的特点是不同的存储引擎支持不同的锁机制:

MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);

BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;

InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。 

二、表级锁

MyISAM 操作数据都是使用的表锁,更新一条记录就要锁整个表,导致性能较低,并发不高。当然同时它也不会存在死锁问题。但表级锁创建锁的开销小,当需要频繁对大部分数据做 GROUP BY 操作或者需要频繁扫描整个表时,推荐使用表级锁。

MySQL表级锁分为读锁和写锁。

1)读锁与写锁

读锁:

  • 申请读锁成功后,所有线程都可对该表进行读操作,但不允许对该表进行写操作,包括当前线程也不允许
  • 当锁住了A表之后,就只能对A表进行读操作,对其他表进行读操作会出现错误(tablename was not locked with LOCK TABLES)
LOCK TABLE table_name [ AS alias_name ] READ

# sql

UNLOCK tables

写锁:当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止

LOCK TABLE table_name [AS alias_name] [ LOW_PRIORITY ] WRITE

# sql

UNLOCK tables

写锁会优先读锁,可通过设置LOW_PRIORITY属性,用来降低该语句的优先级

也可以通过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。

还可以给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,MySQL就暂时将写请求的优先级降低&#x

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值