转自 高性能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 会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁征用的问题;实际应用中很少考虑这种隔离级别;