mysql锁

加锁目的

解决客户端并发访问数据库产生的冲突问题

锁粒度

锁粒度即通常所说的锁级别

应该尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高。 但是加锁需要消耗资源,锁的各种操作(包括获取锁、释放锁、以及检查锁状态)都会增加系统开销。因此封锁粒度越小,有关锁的操作就越频繁,系统开销就越大。 

Mysql提供三种锁级别:页级锁,表级锁,行级锁

  •  MyISAM和MEORY存储引擎采用表级锁; 
  •  DB存储引擎采用的是页面锁,也支持表级锁; 
  • InnoDB存储引擎支持行级锁也支持表级锁默认情况下采用行级锁

Mysql三种锁特性:

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

锁类型

  1. 读锁(共享锁):  简称S锁 ;select : 加读锁以后别人不能更改表记录,但可以进行查询                                                        一个事务对数据对象(数据库、表、页或者行) 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。 
  2. 写锁(排他锁,互斥锁):简称X锁;  insert 、 delete 、 update  加写锁之后别人不能查、不能改。                                  一个事务对数据对象(数据库、表、页或者行)加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。 

死锁和活锁(摘自博文https://blog.youkuaiyun.com/fantalee/article/details/81661665 

1. 活锁
假设事务T1封锁了某数据对象(数据库,表,页,行)R,事务T2也申请封锁R,此时T2处于等待状态;可是当事务T1释放R后,系统允许新来的事务T3封锁了R,T2仍然处于等待状态;从此往后,T2一直处于等待状态。类似于操作系统中线程的“饥饿”状态。

解决办法就是排队,采用先来先服务的策略,系统按照申请数据对象R的先后顺序排队。

2. 死锁
事务T1封锁了数据对象R1,又申请封锁R2,; 
事务T2封锁了数据对象R2;又申请封锁R1. 
两者形成死锁。

死锁预防: 
1)一次封锁法:
事务一次将所要使用的数据对象全部封锁,否则不能执行。 
2)顺序封锁法:所有事务都按照一个顺序封锁数据对象。 
死锁诊断和解除: 
诊断:
使用事务等待图,它动态地反映所有事务的等待情况,并发控制子系统周期性地检测事务等待图,只要在图中出现回路,就说明存在死锁。 
解除:通常选择处理代价最小的事务,将其回滚,释放所有它持有的封锁,使其他事务能继续执行下去。

 

### MySQL 机制详解 MySQL 中的机制是为了保障数据库在高并发环境下的数据一致性和稳定性而设计的重要功能之一。以下是关于 MySQL 机制的具体解析: #### 1. 的分类 MySQL 主要分为两种类型的:表级和行级。 - **表级 (Table-Level Lock)** 表级是最简单的定策略,适用于 MyISAM 存储引擎。它会在整个表上施加,无论是读操作还是写操作都会影响到整张表。对于 `SELECT` 操作,MyISAM 会自动给涉及的所有表加上读;而对于 `UPDATE`, `INSERT`, 和 `DELETE` 则会自动加上写[^3]。 - **行级 (Row-Level Lock)** 行级由 InnoDB 存储引擎实现,提供更高的并发能力。只有涉及到具体记录的操作才会触发行级。例如,在执行 `SELECT ... FOR UPDATE` 或者 `SELECT ... LOCK IN SHARE MODE` 时,InnoDB 只会对符合条件的特定行加而不是封整个表[^2]。 #### 2. 不同存储引擎的特性 不同的存储引擎有不同的行为: - **MyISAM**: 默认使用的是表级别的,这意味着即使是一个小范围内的更新也会阻塞其他线程对该表任何部分的访问[^3]。 - **InnoDB**: 支持事务以及更细粒度的行级,这使得它可以更好地处理复杂的多用户场景下的并发请求[^4]。 #### 3. 常见类型及其作用 除了基本的表级与行级区分外,还有几种具体的形式用于满足不同需求: - **共享 (Shared Lock, S-Lock)** 当一个客户端通过命令如 `LOCK TABLES table_name READ` 获取了一个表上的共享之后,其它客户也可以获得该表上的共享,但不能再获取排他直到当前持有共享的所有连接释放它们为止[^2]。 - **排他 (Exclusive Lock, X-Lock)** 排他允许独占式的修改权限。如果某个事务已经获得了某条记录或者某些列上的排他,则在此期间不允许别的事务再对此同一组资源申请任何形式的新——既包括另外的排他也包括新的共享[^2]。 - **GAP ** 这种特殊的用来阻止新纪录插入到现有两条连续记录之间的空隙(gap)里去。比如当我们运行下面这条SQL语句的时候就会用到gap lock:`SELECT * FROM table_name WHERE id > 10 FOR UPDATE;` - **Next-Key Lock** 是一种组合了索引记录本身(record)和其前面那个区间(gap)两者一起保护起来的一种复合型模式。主要用于解决可重复读(repeatable read)隔离级别下可能出现的幻影问题(phantom problem)[^4]。 #### 4. 死现象及预防措施 死是指两个或更多事务相互等待对方持有的资源从而进入僵局的状态。为避免这种情况发生可以采取以下方法: - 尽量按照固定的顺序访问资源; - 减少单次事务持续时间; - 设置合理的超时参数让系统能够及时发现并终止潜在的死循环状况等等[^4]。 ```sql -- 示例:如何手动解表 UNLOCK TABLES; ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值