MySQL系列:7 事务和隔离--概念篇

it2024-04-14  114

开门见山

概念

Transactions:A collection of data manipulation execution steps that are treated as a single unit of work

事务:指被看作一个独立工作单元的一组数据操作步骤。其包含两组量词:一个独立工作单元,代表事务被看作一个操作整体;一组数据操作:代表可能包含多个DML操作;

ACID:事务的实现需要遵从的四大特性。

Aatomic。原子性,表示事务必须被视为一个不可分割的最小工作单元。事务中的所有操作,要么全部提交成功,要么失败全部回滚。CConsistent。一致性,表示数据库总是从一个一致的状态转换到另一个一致的状态。IIsolated。隔离性,表示一个事务在提交前,不会影响其他事务;DDurable。持久性,表示事务所做的修改将永久保存在数据库中;

说明

         事务的实现在某些行业必须能得到保证,如银行转账,A账户转出200CNY至B账户,在账户层面,此操作至少涉及两次修改,一是A账户减少200,二是B账户增加200。两次操作要么均成功,要么均失败,否则可能引起问题。

         尽管概念简单,但是数据库系统要实现事务的ACID特性需要更多的资源消耗,如CPU、内存等;且事务的实现需要考虑其他问题,主要有:脏读(“Dirty” read)、不可重复读(Non-repeatable read)、幻读(Phantom read)。后文将详细叙述。

Transactions

Transaction Isolation Problems-事务隔离问题

         正如前文所说,事务的实现需要考虑如下三个主要问题,即事务隔离问题:

脏读(“Dirty” read):表示某个事务读到其他事务尚未提交的数据;不可重复读(Non-repeatable read):指同一事务中不同时间的同一read操作获取到的数据可能不同;幻读(Phantom read):幻读与不可重复读概念相近,但侧重点不同,幻读侧重的是事务某一次的 select 得到的结果所表征的数据状态无法支撑后续的业务操作。如某个事务A操作逻辑需要select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在(被其他事务插入),无法插入,而等到事务A提交后,结果此记录实际不存在(其他事务回滚了此记录),则表示事务A产生了幻读;

Isolation Levels-隔离层级

         正如上述事务隔离问题,SQL标准定义了几种不同的事务隔离层级用于解决上述问题。MySQL实现的隔离层级如下:

READ UNCOMMITTED:未提交读。

Allows a transaction to see uncommitted changes made by other transactions

此隔离级别允许事务查询到其他事务未提交的变更。因而,此隔离级别下,脏读、不可重复读、幻读问题均存在;

READ COMMITTED:提交读

Allows a transaction to see committed changes made by other transactions。

此隔离级别只允许事务查询到其他事务已提交的变更,因而可解决脏读问题;

REPEATABLE READ:可重复读

Ensures consistent SELECT output for each transaction。

此隔离级别确保同一事务中连续的select输出,可解决脏读、不可重复读问题,但存在幻读问题;此隔离记录是MySQL InnoDB引擎默认的隔离级别;

SERIALIZABLE:串行化

Completely isolates the effects of a transaction from others.

此隔离级别通过强制事务串行执行,完全隔离事务间的影响,可解决幻读问题。

综上,四种隔离级别与其解决的问题对应关系如下:

         其中,在repeatable read层级下,InnoDB引擎无幻读问题,其通过快照snapshot解决可重复读问题。具体后文再叙。

相关命令

查询默认隔离级别

mysql> show variables like '%isolation%'; +-----------------------+-----------------+ | Variable_name         | Value           | +-----------------------+-----------------+ | transaction_isolation | REPEATABLE-READ | | tx_isolation          | REPEATABLE-READ | +-----------------------+-----------------+ 2 rows in set (0.01 sec)

设置隔离级别

与MySQL其他配置类似,有三种方式可以设置服务器的隔离级别:

配置文件

在配置文件中加入transaction-isolation选项配置;

启动选项

在mysqld进程的启动选项中,加入--transaction-isolation选项;

通过客户端对运行运行服务器进行设置

可通过mysql客户端对服务器的隔离层级进行设置,默认设置为会话session级,可通过global关键词设置全局配置,如下:

select @@global.XXX 和 select @@session分别查看全局和会话级配置;

总结

         事务是数据库的基础,数据库(MySQL、ORACLE等)的很多高级特性都围绕事务展开,因而深刻理解事务的概念和ACID等特性,将可在后续的数据库开发/运维中做到游刃有余。

         在本文的基础上,后续笔者将继续阐述有关MySQL事务的其他概念,如提交commit、锁lock,也将通过具体实例解释相关概念。

最新回复(0)