MySQL隔离级别解析:数据一致性与高并发之间的平衡术!

DDL:数据定义 , 它用来定义数据库对象,包括库 , 表,列 , 通过ddl我们可以创建,删除,修改数据库和表结构;
DML:数据操作语言,增加删除修改数据表中的记录;
DCL:数据控制语言,定义访问权限和安全级别;
DQL:数据查询语言,用它来查询想要的记录 。
SQL执行顺序:

  1. from;
  2. join
  3. on
  4. where;
  5. group by;
  6. avg,sum.... 使用聚集函数进行计算;
  7. having;
  8. select;
  9. distinct;
  10. order by;
  11. limit;
今天来讨论MySQL中的事物隔离级别
1事物概念事务是由一组SQL语句组成的逻辑处理单元 。
事务具有以下4个属性,通常简称为事务的ACID属性:
原子性:事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行 。
一致性:在事务开始和完成时,数据都必须保持一致状态 。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性 。
隔离性:数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行 。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然 。
持久性:事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持 。
事务的启动方式
  1. 显式启动 set autocommit=1 begin 或 start transaction 。配套的提交语句是 commit,回滚语句是 rollback 。
  2. set autocommit=0 自动提交关掉,意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交 。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接 。
  3. 用commit work and chAIn代替 commit可以提交一个事务,并且开启另一个新的事务 。
2事物带来的问题我们的数据库一般都会并发执行多个事务 , 多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题 。
这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题 。接下来 , 我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理 。
脏写当两个或多个事务选择同一行,然后基于最初选定的值更新该行时 , 由于每个事务都不知道其他事务的存在,就会发生丢失更新问题,最后的更新覆盖了由其他事务所做的更新 。
脏读一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致的状态;这时 , 另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此作进一步的处理,就会产生未提交的数据依赖关系 。这种现象被形象的叫做“脏读” 。
例:事务A读取到了事务B已经修改但尚未提交的数据 , 还在这个数据基础上做了操作 。此时 , 如果B事务回滚,A读取的数据无效,不符合一致性要求 。
不可重读一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读” 。
例:事务A内部的相同查询语句在不同时刻读出的结果不一致,不符合隔离性
幻读一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读” 。
例:事务A读取到了事务B提交的新增数据,不符合隔离性
不可重复读与幻读有什么区别?不可重复读的重点是修改:在同一事务中,同样的条件 , 第一次读的数据和第二次读的「数据不一样」 。(因为中间有其他事务提交了修改)
幻读的重点在于新增或者删除:在同一事务中,同样的条件,第一次和第二次读出来的「记录数不一样」 。(因为中间有其他事务提交了插入/删除)


推荐阅读