锁模式

<o:p></o:p>
    在事务系统中很重要的一个概念就是“锁”。在事务系统中“事务”概念保证了数据访问的原子性,即单事务进程中一组数据访问的一致性,而“锁”的概念保证了数据访问的隔离性与排他性,即并发事务进程之间的同步访问的独立性。有一个数据分别有两个用户要去修改,我们需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制也就是所谓的,即给我们选定的目标数据上锁,使其无法被其他程序修改。

一般在事务系统中的“锁”机制可以分为两种不同的模式:悲观锁模式以及乐观锁模式。这两种“锁”模式要解决的问题都大致一样:多程之间的同步访问的独立性问题。只是环境上下文有所不同。当然,这就会导致,解决该问题的方案有所区别。

乐观锁模式:乐观锁模式假设环境中需要同时访问同一数据的并发事务较多,但访问数据时间较短,事务进程可以忍受少量的数据修改失败。由于使用了如此假设,则使用的加锁方案策略就比较宽松。一般使用于数据本身相关的版本控制机制来实现。
   
    比较常见的手法就是用数据的一部分或另外增加一部分作为修改的版本号,在修改视校对版本号,一旦校对正确就同时修改数据本体与版本号;如果校对版本号失败则表示数据过期,可以回滚事务。使用该方式时,如果访问数据的事务进程都来自同一个系统,则完全可以达到隔离要求。然而,如果事务进程是来自不同系统,那么事情就比较麻烦了。因为,两个系统不是相同的“锁”方案就会导致混乱的局面。这时候可能就需要严格一些的乐观锁。
   
    较之前的乐观锁实现方案,还有一种比较严格的乐观锁方案。就是在版本号上做文章,使用数据完全关联的版本号。比如,对整个数据进行hash处理得出一个版本号。每当修改数据的任何一部分时都先检查校对版本号,一旦成功就更新的数据以及整个新的数据的hash版本号;如果校对版本号失败则表示数据过期,可以回滚事务。使用该策略,可以包保证的多系统访问独立性。然而,不论是把这个hash过程放在事务进程所在的系统还是放在数据所在的系统均会对整个体系的性能造成影响。

悲观锁模式:悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度。其策略也就比较严格,在整个数据被访问的期间该“锁”都将锁住数据禁止他人访问。一般使用数据所在系统本身的功能来实现悲观锁。

举个具体例子:有些关系数据库管理系统支持select …for update功能。该功能表示,在用户使用该查询语句时,系统将锁住被选的数据项或数据表。这样就拒绝了其他用户访问,直到该用户主动解开锁,或者锁超时。

参考:"POEAA", http://blog.sohu.com/members/walker/

<think>我们正在回答用户的问题:“我想了解MySQL的模式 请问MySQL模式介绍”。根据之前的对话历史,用户可能是在调试存储过程时遇到了的问题,现在想深入了解MySQL的机制。 结合引用内容,我们需要介绍MySQL的模式,尤其是InnoDB存储引擎的模式。 引用中提到了: 引用[1]:关于innodb_autoinc_lock_mode,这是自增模式,属于表级的一种特殊情况。 引用[2]:行级定是由存储引擎实现的,如InnoDB和NDBCluster,我们将重点介绍InnoDB。 引用[3]:排他(X)和共享(S)的概念,以及SELECT ... FOR UPDATE的语法。 引用[4]:MySQL源码中的模式枚举,包括LOCK_IS, LOCK_IX, LOCK_S, LOCK_X, LOCK_AUTO_INC等。 因此,我们主要介绍InnoDB的模式,包括: 1. 共享(S)和排他(X)——行级的基本模式。 2. 意向(Intention Locks)——表级,包括意向共享(IS)和意向排他(IX)。 3. 自增(AUTO-INC Locks)——表级,用于自增列。 4. 记录(Record Locks)、间隙(Gap Locks)、临键(Next-Key Locks)——行级的三种算法,但它们属于的算法,而模式主要是S和X。 注意:模式是指的属性(共享、排他等),而的算法是指的范围(记录、间隙等)。 我们还需要注意,用户可能对的兼容性感兴趣,所以可以给出的兼容性矩阵。 回答结构: 1. 引言:介绍MySQL模式的重要性以及InnoDB作为重点。 2. 行级的基本模式: - 共享(S) - 排他(X) 3. 意向(表级): - 意向共享(IS) - 意向排他(IX) 4. 自增(AUTO-INC Locks) 5. 的兼容性 6. 总结 注意:在回答中适当引用参考文献,例如在介绍自增时引用[1],在介绍行时引用[2][3][4]。 </think>### MySQL 模式详解 MySQL 的模式主要分为 **表级** 和 **行级** 两大类,不同存储引擎支持的模式有所差异。以下是核心模式的系统分析: --- #### 一、表级模式 适用于 MyISAM 等引擎,定整个表: 1. **共享 (S Lock)** - 允许多个会话同时读取数据 - 语法示例:`LOCK TABLES table_name READ` - 兼容性:允许其他会话加 S ,禁止加 X [^3] 2. **排他 (X Lock)** - 独占访问权限,禁止其他任何 - 语法示例:`LOCK TABLES table_name WRITE` - 兼容性:阻塞所有其他请求[^3] 3. **自增 (AUTO-INC Lock)** - 保证自增字段的连续性 - 通过 `innodb_autoinc_lock_mode` 配置行为: - `0`:传统模式(全表) - `1`:连续模式(默认) - `2`:交错模式(最高并发)[^1] --- #### 二、行级模式 (InnoDB 实现) 支持更细粒度的并发控制: 1. **共享 (S Lock)** - 允许多事务并发读取同一行 - 语法:`SELECT ... LOCK IN SHARE MODE` - 兼容性:允许其他 S ,禁止 X [^4] 2. **排他 (X Lock)** - 独占行访问权限 - 语法:`SELECT ... FOR UPDATE` - 兼容性:阻塞所有其他请求[^3] 3. **意向 (Intention Locks)** - 表级,标识即将施加的行类型: - `IS`(意向共享):将施加 S - `IX`(意向排他):将施加 X - 作用:避免表级冲突[^4] ```mermaid graph TD A[表级] --> B[共享 S] A --> C[排他 X] A --> D[自增 AUTO-INC] E[行级] --> F[共享 S] E --> G[排他 X] E --> H[意向 IS/IX] ``` --- #### 三、兼容性矩阵 | 请求 \ 已存在 | IS | IX | S | X | |-------------------|----------|----------|----------|----------| | IS | ✓ | ✓ | ✓ | ✗ | | IX | ✓ | ✗ | ✗ | ✗ | | S | ✓ | ✗ | ✓ | ✗ | | X | ✗ | ✗ | ✗ | ✗ | > ✓ 表示兼容,✗ 表示冲突[^4] --- #### 四、实践建议 1. **优先使用行级** 在事务中通过 `SELECT ... FOR UPDATE` 定关键行,减少竞争[^2] 2. **控制粒度** 批量操作时使用批次提交(如 `LIMIT 200000`),避免长事务阻塞 3. **监控争用** ```sql SHOW ENGINE INNODB STATUS; -- 查看等待 SELECT * FROM information_schema.INNODB_LOCKS; -- 查看活跃 ``` --- #### 五、总结 MySQL 模式的核心是通过 **共享(S)** 实现并发读,通过 **排他(X)** 保证写安全,辅以 **意向(IS/IX)** 提升效率。实际应用中需根据场景权衡粒度,InnoDB 的行级在多数高并发场景更优[^2][^4]。 --- ### 相关问题 1. InnoDB 的间隙(Gap Lock)如何解决幻读问题? 2. 如何优化 `SELECT ... FOR UPDATE` 在百万级数据表的性能? 3. 什么是死检测(Deadlock Detection)?MySQL 如何处理死? 4. 在读写分离架构中,行级如何影响主从同步? 5. 自增模式 `innodb_autoinc_lock_mode=2` 的适用场景和风险? 6. 如何通过索引设计减少冲突? [^1]: 自增模式配置说明 [^2]: InnoDB 行级实现原理 [^3]: 排他与共享特性 [^4]: MySQL 源码模式定义
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值