事务的 4个 特性(ACID)
- 原子性(Atomicity):事务是不可分割的工作单元,其包含的操作,要么都做,要么都不做。
- 一致性(Consistency):事务执行后,数据记录必须符合各项约束条件。
- 隔离性(Isolation):并发事务的执行不能相互干扰。
- 持久性(Durability):事务成功提交意味着相关改动已被持久化保存。即使数据库服务中断,也不会丢失以提交事务的改动。
事务的 4个 隔离级别
事务的隔离级别用于控制事务的并发执行。MySQL InnoDB提供了 SQL-1992 中定义的4个隔离级别。
可为事务设置隔离级别,以优化事务并发的性能。
可为单个session设置(set transaction),也设置MySQL的默认隔离级别。
Repeatable Read:可重复读
这是MySQL默认的隔离级别,也是最常用的级别。
在单次事务内,多次执行相同的(非锁)查询操作,所得结果相同。(除非事务内部自己改了数据)
在第一次查询结果返回后,这些结果数据会被做成快照,后续相同的查询将从快照获取结果(MVCC,Multiversion Concurrency Control)。
这种不加锁的模式存在 幻读 问题。
Update、Delete、有锁读(Select For Update/Share)操作需要加锁。可防止 幻读。
使用了 唯一索引 查询条件:只锁住索引指向的记录(record lock)。
其它查询条件:会锁住索引记录及受影响的相关区域记录(gap lock,next-key lock)
Read Committed:读已提交
非锁读:每次读取都使用一个新建的快照,即使这些读取操作都在同一次事务中(不可重复读)。
Update、Delete、有锁读:只锁住索引指向的记录,允许其它session在受影响的区域插入数据。只有在检查外键和重复建时会使用 间隙锁(gap lock)。
因为不对受影响的区域使用 间隙锁(gap lock),其它session插入新数据可能会导致 幻读(Phantom Rows)。
对于 Update 和 Delete,InnoDB只会对被更新或删除的记录加锁,其它未匹配到的记录在Where条件执行结束后就会被释放,所以可大大减小发生死锁的几率。
对于 Update,如果真的发生了死锁,InnoDB会尝试“半一致”读取,返回最近被提交的版本,以决定相关记录是否符合当前Update中的Where条件。
Oracle的默认事务隔离级别就是 Read Committed。为什么MySQL的是 Repeatable Read?
Read Uncommitted:读未提交
Serializable:串行
这是 最高 的隔离级别。
所有事务依次逐个执行(如有必要),完全不会互相干扰。性能也最低。
MySQL 中的锁
悲观锁 vs 乐观锁
悲观锁:为避免其它事务意外修改数据,可使用悲观锁。Select ... For Update 这样的语句就可以实现此类效果。
乐观锁:使用CAS机制,不对数据加锁。通过比对数据的时间戳或版本号来满足相关版本判断。
MVCC(Multiversion Concurrency Control)就是乐观锁。
排他性的读写锁、双阶段锁 都是悲观锁。
表级锁(Table-Level Lock)
MySQL中 粒度最大 的锁。对当前操作的整个表加锁。不会出现死锁,并发度低。
MyISAM 采用表级锁。InnoDB 默认使用行级锁,也支持表级锁。
行级锁(Row-Level Lock)
MySQL中 粒度最小 的锁。只对当前操作的记录行加锁。并发度高,会出现死锁。
InnoDB 中的几种锁类型
InnoDB 实现了多种类型的锁(算法):
- 共享/排它锁(Shared/Exclusive Lock):共享锁也称为 读锁,用于读取数据;排它锁也称为 写锁,用于更新或删除数据。
- 记录锁(Record Lock):对具体索引记录的锁。
-
间隙锁(Gap Lock):对索引区间的锁。
插入意向锁(Insert Intention Lock)是特殊的间隙锁。 - Next-Key Lock:记录锁 和 间隙锁 的结合。可以防止幻读。如果查询索引属于唯一索引,会降级为 Record Lock。
- AUTO-INC Lock:一种特殊的表级锁。用于自增列(Auto_Increment)。
- 空间索引预言锁(Predicate Locks for Spatial Index):类似 Next-Key Lock,专用于空间索引。因为Next-Key Lock 无法空间索引(多维数据没有绝对的顺序概念),所以为了支持 “可重复读” 和 “串行” 这两个隔离级别,需要此类型的锁。
- 意向锁(Intention Lock):属于表级锁,包括 意向共享锁(IS)和 意向排它锁(IX),使得InnoDB锁的颗粒度更多样化。
虽然也可以在应用程序端主动使用MySQL的锁方法(Get_Lock、Release_Lock),既降低加锁的开销,又获得所需的一致性,但还是不建议这么做。这种做法维护太复杂,几乎总是得不偿失。
使用类似Spring事务管理框架应该是比较通用流行的方式。
相关推荐
MySQL事务与锁详解的知识点如下: 1. 事务的理解与应用场景: 事务是数据库管理系统(DBMS)执行过程中的逻辑单位,是一个不可分割的工作单元,可以包含一条或多条DML语句。在实际应用中,事务常见的使用场景包括:当...
### MySQL事务与锁机制详解 #### 一、锁概念简介 **1、基础描述** 锁机制主要用于解决数据库中多线程或多个会话同时访问同一数据资源时出现的竞争问题。在MySQL中,锁机制是非常重要的组成部分之一,它与其他核心...
在深入探讨MySQL事务和锁的原理之前,我们首先需要对“事务”的概念有一个基本的理解。事务是一组操作的集合,这些操作要么全部完成,要么全部不做,确保数据库从一种一致性状态转换到另一种一致性状态,而不会留下...
1.事务 1.1 什么是事务? 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。 1.2 哪些引擎支持事务 InnoDB支持事务 1.3 事务的四大特性 原子性(Atomicity):强调事务的不可分割,...
msql
│ day3_MySQL事务与锁详解-笔记.pdf │ day3_MySQL事务与锁详解-课件.pdf │ day3_MySQL事务与锁详解.mp4 │ day3_事务与锁演示SQL.sql │ day4_MySQL性能优化总结-笔记.pdf │ day4_MySQL性能优化总结-课件.pdf │...
MySQL锁与事务知识脑图
MySQL 8.0 锁机制和事务 MySQL 8.0 中的锁机制和事务是数据库系统中非常重要的概念。锁机制是指数据库系统中对数据访问的控制机制,而事务是指数据库系统中的一组操作单元。了解锁机制和事务是非常关键的,因为它们...
mysql 事务等待锁超时分析
### MySQL_InnoDB 事务与锁详解 #### 引题:为何引入事务? 事务在数据库管理系统中扮演着极其重要的角色,其主要目的有三: 1. **数据完整性**:确保数据库中的数据始终保持一致性和正确性,避免因部分操作失败...
深入理解Mysql事务隔离级别与锁机制 Mysql事务隔离级别与锁机制是数据库系统中非常重要的概念,它们都是为了解决多事务并发问题而设计的。下面我们将深入讲解这些机制,让大家彻底理解数据库内部的执行原理。 事务...
### MySQL事务及锁原理详解 #### 一、事务的基本概念 事务(Transaction)是数据库操作的基本单位,一组逻辑上完整的工作单元。在事务中,一系列的操作要么全部完成,要么都不进行,确保了数据的一致性和可靠性。...
- InnoDB与MyISAM存储引擎的区别:InnoDB支持行级锁和事务,而MyISAM主要支持表级锁。 在使用过程中,应该根据实际的应用场景和性能需求,合理选择存储引擎和锁策略,以达到最优的并发控制效果。对于可能出现的锁争...
MySQL中的事务和锁是数据库管理中的关键概念,对于保证数据的一致性和完整性至关重要。事务是数据库操作的基本单元,它确保一组操作要么全部成功,要么全部失败,从而避免数据的不一致状态。在MySQL中,事务支持ACID...
### MySQL数据库:事务与锁机制 #### 一、事务的基础概念与特性 ##### 1. 事务的概念 事务(Transaction)是数据库操作的基本单位。它确保了一组操作要么全部成功,要么全部失败,从而保持数据的一致性和完整性。...
详解Mysql事务隔离级别与锁机制 本篇文章详细介绍了Mysql事务隔离级别与锁机制的概念、原理和应用。事务隔离级别是数据库系统中的一种机制,用于解决多事务并发问题,包括脏写、不可重复读、幻读等问题。锁机制是...
MySQL中的锁机制是数据库并发控制的关键部分,它确保了在多用户环境中数据的一致性和完整性。在MySQL中,主要存在两种类型的锁:行级锁(Row-Level Locks)和表级锁(Table-Level Locks)。InnoDB存储引擎默认支持...