mysql中的锁

什么是锁?
对于一个数据库来说,有两点需要保证,第一是速度,第二是安全。数据库既要保证能支持高并发的数据访问,又要保证高并发的数据访问不会出错,也就是mysql的锁机制,锁是数据库系统区别于文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问

mysql中数据库锁的分类:
这里写图片描述

mysql中的锁可以基本划分为lock和latch(闩锁\轻量级的锁),lock分为行锁、表锁、意向锁。 latch分为读写锁和互斥量。

关于latch:http://www.cnblogs.com/data-zhang/p/6971718.html

锁的类型:
锁可以分为读锁和写锁两种,也叫共享锁(S)和排他锁(X)。
这里写图片描述

读锁与读锁可以兼容,写锁与任和锁都不兼容。

还有两种锁,意向共享锁(IS),意向排他锁(IX):
这里写图片描述

锁的粒度
意向排他锁和意向共享锁的锁粒度是整个表, 排它锁和共享锁锁定的是记录,也就是行级锁。

读锁的应用:
读锁本身是一种共享锁,但是读锁本身也有两种方式,一致性的非锁定读、一致性的锁定读:

一致性非锁定读:
这里写图片描述

一致性非锁定读不会锁定数据行,而是锁定数据行的快照,即生成新的数据快照,并加锁。

一致性的锁定读:
顾名思义,这种读取的方式会锁定数据行,有以下的两种方式。
Select …… for update
Select …… LOCK IN SHARE MODE

更新丢失以及处理办法:

假设有这样一种情况:
这里写图片描述

这种情况下User1修改的数据就会丢失,解决办法是直接加锁:

select * from user where id=1 for update;

INNODB行锁的算法
Record Lock:单行记录上的锁
Gap Lock:间隙锁,锁定一个范围,但不锁定记录
Next Key Lock:Gap Lock+Record Lock锁定一个范围并且锁定记录本身

行锁很容易理解,就是对一个数据行加锁,间隙锁是指的是锁锁定一个“间隙”,一个范围。 【删除不存在的对象会产生间隙锁,且可能造成死锁。】, next key lock 是两者的结合,锁定对象和范围。

死锁
死锁是指两个或者两个以上事务执行过程中,因争夺锁资源而造成的一种相互等待的现象。

死锁的解决方式:
1,超时
2,采用wait-for gragh(等待图)的方式进行死锁检测
这里写图片描述

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的标准机制,而是某些库或优化策略使用的高级概念,它让进程在获取失败时循环尝试,直到成功。 了解这些的类型有助于管理和优化并发性能,尤其是在高并发环境下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专注网赚的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值