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

开门见山

概念

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值