1. 简介

事务(Transaction)是数据库管理系统(DBMS)中的一个重要概念,它是一系列操作的集合,这些操作要么全部执行成功,要么全部失败。事务是数据库的基本操作单元,它是数据库系统中的一个逻辑单位,用于保证数据的一致性、隔离性和持久性。

在MySQL中,事务具有以下四个特性,通常称为ACID特性:

  1. 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败。原子性保证了事务的不可分割性,即事务中的操作是一个整体,不能被分割或拆分。
  2. 一致性(Consistency):事务执行前后,数据库的状态应该保持一致。一致性保证了事务的执行不会破坏数据库的完整性约束和业务规则。
  3. 隔离性(Isolation):事务之间应该相互隔离,一个事务不应该受到其他事务的干扰。隔离性保证了事务的执行不会受到其他并发事务的影响,从而确保数据的正确性。
  4. 持久性(Durability):事务一旦提交,其对数据库的所有修改都应该是永久性的。持久性保证了事务的执行结果能够被持久化存储,即使在系统故障的情况下,事务的执行结果也不会丢失。

在MySQL中,可以使用以下命令来控制事务:

  • START TRANSACTION; or BEGIN;:开始一个新的事务。
  • COMMIT;:提交当前事务,使事务中的所有修改生效。
  • ROLLBACK;:回滚当前事务,撤销事务中的所有修改。

2. 事务并发

事务并发是指多个事务同时执行,这可能会导致以下问题:

  1. 丢失更新:当两个或多个事务同时对相同的数据进行更新时,最后提交的事务可能会覆盖之前提交的事务所做的修改,导致之前的更新丢失。
    1. 解决办法:乐观锁+版本号
  2. 脏读:当一个事务读取了另一个事物尚未提交的数据时,如果该事务最终回滚,则读取到的数据就是无效的,这种现象被称为脏读。
  3. 不可重复读:当一个事务在读取同一行数据时,由于其它事务的更新操作导致多次读取到的数据不一致,即同一行数据在前后两次读取之间发生了变化。
  4. 幻读:当一个事务在读取某个范围内的数据时,另一个事务在该范围内插入了新的数据或删除了已有数据,导致第一个事务在后续读取时发现多出或缺少了数据行,出现幻读现象。

为了解决事务并发带来的问题,数据库系统提供了事务隔离级别(Transaction Isolation Level)的概念。事务隔离级别定义了一个事务与其他事务之间的隔离程度,以防止并发事务带来的问题。MySQL支持以下四种事务隔离级别:

  1. 未提交读(Read Uncommitted):允许一个事务读取另一个事务未提交的数据。这可能导致脏读、不可重复读、幻读。
  2. 已提交读(Read Committed):只允许一个事务读取另一个事务已经提交的数据。这可以防止脏读问题,当仍然坑出现不可重复读和幻读问题。
  3. 可重复读(Repeatable Read):在同一个事务中多次读取同一数据时,保证读取到的数据时一致的。这可以防止脏读和不重复读问题,但仍会出现幻读问题。
  4. 串行化(Serializable):要求所有的事务串行执行,即一个事务在执行时,其它事务必须等待。这可以防止脏读、不可重复读和幻读问题,但会降低并发性能。
隔离级别 脏读 不可重复读 幻读
未提交读(Read Uncommitted)
已提交读(Read Committed)
可重复读(Repeatable Read)
串行化(Serializable)

3. 查看、设置MySQL事务隔离级别

-- 查看事务隔离级别
-- 使用系统变量查询
SELECT @@transaction_isolation;

-- 5.7.20之前
SHOW VARIABLES LIKE '_isolation';

-- 5.7.20之后版本
SHOW VARIABLES LIKE 'transaction_isolation';

-- 设置事务隔离级别
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意

腾讯云开发者社区:孟斯特