什么是事务?事务(Transaction)一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit),具有4个特性:原子性、一致性、隔离性、持久性,简称ACID。
那么Mysql的事务隔离级别又是什么呢?Mysql的事务隔离级别分别是4种:未提交读(Read Uncommitted)、已提交读(Read Committed)、Repeatable Read(可重复读)、Serializable(可串行化)。可以简单理解为Mysql事务的4种执行标准。
一、ACID特性
原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(Consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability):指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
二、Mysql事务隔离级别
未提交读(Read Uncommitted),指当前事务可以读取到其他事务还未提交的数据变化,最容易带来的问题是脏读(Dirty Read),很少应用到生产环境。
已提交读(Read Committed),大部分数据库默认隔离级别但不包括Mysql,指当前事务可以读取其他事务已提交的数据变化,具有隔离性的基本标准,但是在出现交叉事务的并发操作场景中会发生两次读取的数据结果集不一致的问题,即不可重复读(Nonrepeatable Read)。
Repeatable Read(可重复读),Mysql数据库的默认隔离级别,这里顺便解释一下为什么Mysql的隔离级别不是Read Committed,因为在Mysql5.0之前日志格式只有statement这一种,这种格式导致主从复制一致性很难得到保证。这种隔离级别可以解决Nonrepeatable Read的问题,但如果也出现在交叉事务的并发操作场景会出现幻读(Phantom Read)的现象,这一行为状态是当前事务不能及时有效的读取其他事务的数据变化。
Serializable(可串行化),Mysql事务隔离最高级别,望文生义大概意思是事务的执行是有序(串行化顺序)的,不存在事务交叉执行的场景从而解决了Phantom Read的问题,但是在高并发的业务场景下请求会出现阻塞、超时、锁竟抢的问题,系统的可用性也随之降低。
收尾
https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html // Mysql事务官方文档