高性能mysql_事务及4种隔离级别

转自 高性能mysql

【1.3】事务

1)事务定义:事务就是一组原子性的sql查询,或者说一个独立的工作单元。

即事务内的sql语句,要么全部执行成功,要么全部执行失败;

2)事务的ACID概念:原子性automicity,一致性consistency,隔离性isolation,持久性durability;

  • 原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚;
  • 一致性;数据库总是从一个一致性状态转移到另一个一致性状态;
  • 隔离性:通常来说,一个事务所做的修改在最终提交前,对其他事务都是不可见的;
  • 持久性:一旦事务提交,则其所做的修改就会永久保存到数据库中;此时即使数据库崩溃,数据也不会丢失;

【1.3.1】4种隔离级别

级别1)READ UNCOMMITED 未提交读:事务的修改,即使没有提交,对其他事务也是可见的;

级别2)READ COMMITTED 提交读:一个事务从开始直到提交之前,所做的任何修改对其他事务不可见的;

也叫不可重复读,因为两次执行相同的查询,可能得到不同的查询结果;

级别3)REPEATABLE READ 可重复读:RR 解决了脏读问题。该级别保证在同一事务中多次读取同样记录的结果是一致的 ;(mysql的默认事务隔离级别)

但 RR 无法解决幻读问题,幻读指的是当某个事物在读取某个范围内的记录时,另外一个事务又在该范围内插入了一条新的记录,当之前的事务再次读取到该范围的记录时,会产生幻行;

不过 mysql中的 innodb 和 XtraDB 存储引擎通过多版本并发控制 MVVC(multiversion concurrency control) 解决了幻读问题;

级别4)SERIALIZABLE 可串行化:最高隔离级别。通过强制事务串行执行,避免了前面说的幻读问题。

简单说,SERIALIZABLE 会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁征用的问题;实际应用中很少考虑这种隔离级别;

猜你喜欢

转载自blog.csdn.net/PacosonSWJTU/article/details/81193368