msyql中锁的分类

本文介绍了MySQL中的锁机制,包括锁的分类方式、性能角度的乐观锁与悲观锁、操作类型的读锁和写锁,以及不同粒度的表锁、行锁、页面锁和间隙锁。乐观锁通过version字段实现,悲观锁利用select ... for update语句。锁的粒度从表级到行级,确保数据的并发控制和一致性。


定义

锁主要是为了在并发情况下协调多个进程或线程针对某个资源的访问.

(mysql就是使用锁和MVCC实现了隔离机制)

一、锁的分类方式

锁可以从 性能(实现思想),操作类型,数据粒度.

二、分类

1.性能(实现思想)

  1. 乐观锁
    乐观锁指的是对于数据库的读写处于乐观的态度.它默认认为数据库不会发生冲突.只有在数据提交的时候检测。常见的实现方式:增加一个version字段.
    在更新数据的时候判断version版本是否一致.
  2. 悲观锁
    悲观锁指的是对于数据的读写持悲观态度.即在读写数据的时候都会加锁.
    它主要通过数据库的机制类实现.如在mysql中 select … for update

2.操作类型

  1. 读锁
    读锁又称为共享锁(或S锁),针对同一份数据可以加多个读锁.
  2. 写锁
    写锁又称为排他锁(或X锁),针对同一份数据在加了写锁后,如果未释放会阻塞其他的写锁或写锁

读锁之间不互斥
写锁之间互斥
读写锁之间互斥

3.锁的粒度

  1. 表锁
    表锁指的是针对整个表数据进行加锁或释放锁.表锁分为
    表锁(表共享锁/表独占锁)
    元数据锁(MDL)

  2. 行锁
    在数据行上对数据进行加锁和释放锁.

  3. 页面锁
    也称为页级锁.就是在页对数据进行加锁和释放锁.

  4. 间隙锁(Gap lock)
    当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时, InnoDB会给符合条件的已有数据记录的索引项加锁.对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”

  5. 临键锁(next-key lock)
    行锁和间隙锁的组合.

在MySQL中,(Locking)用于控制并发访问数据库资源以避免数据一致性问题。MySQL支持多种类型,这些可以分为以下几类: 1. **共享(Shared Locks, S)**: - 允许读取数据,但阻止其他事务对同一行进行写操作。如果多用户同时请求共享,则所有请求都会立即获得。 ```sql SELECT * FROM table WHERE id = 1; -- 获取S ``` 2. **排他(Exclusive Locks, X)**: - 只允许一个事务独占一行,阻止其他事务进行读取或写入操作。 ```sql INSERT INTO table VALUES (1, 'value'); -- 获取X UPDATE table SET column = 'new_value' WHERE id = 1; -- 获取X DELETE FROM table WHERE id = 1; -- 获取X ``` 3. **意向(InnoDB Only, IX)**: - InnoDB存储引擎特有的,用于定表级,允许事务定整个表以便在其范围内进行插入或删除操作。 ```sql LOCK TABLES table WRITE; -- 获取IX ``` 4. **行级乐观(Row-Level Optimistic Locking, ROWX)**: - MySQL的默认行为是行级定,但可以通过`SELECT ... FOR UPDATE`语句实现乐观,它会检查行的版本号是否与先前读取时一致。 5. **死(Deadlocks)**: - 当两个或更多的事务因等待对方释放资源而互相阻塞时,就会发生。 6. **自旋(Spin Locks)**: - 这不是MySQL的标准机制,而是某些库或优化策略中使用的高级概念,它让进程在获取失败时循环尝试,直到成功。 了解这些类型有助于管理优化并发性能,尤其是在高并发环境下。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值