一、Mysql的事务( transaction):
概念:指访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行(回滚),是一个不可分割的最小单元(unit)。事务由事务开始与事务结束之间执行的全体操作组成。
1. 事务的特性(简称:ACID)
(1)原子性:( Atomicity )事务是不可分割的原子单位,也就是说数据的操作要不然一起成功,要不然一起失败。即事务提交和事务回滚。
(2)一致性:(Consistency)事务的执行不能影响数据库数据的完整性和一致性。即在事务执行前和执行后数据库都是一致性状态。这个和原子性是密切相关的。
(3)隔离性:(isolation)针对于并发来讲的。一个事务的执行不会对其他事务造成干扰。即并发事务之间是隔离的,不能互相干扰。
(4)持久性:(durability)也成为永久性,指的是一个事务提交后对数据库的改变时永久性的,接下来的其他操作或者故障对其不会产生影响。
二、什么是脏读、幻读、不可重复读?
1. 概念:脏读、幻读、不可重复读是事务的隔离级别中,事务并发遇见的最常见的问题。
(1)脏读:简言之就是一个事务可以读取到另一个事务没有提交的数据,由于某些原因这条没有提交的数据执行了Rollback(),那么这个事务(红色的)读取到的数据就是不正确的。
(2)幻读:一个事务内两次读到的同一条件数据的(行数)结果不同,好像出现了幻觉。比如一个事务在做对全部数据的统一修改操作,与此同时第二条事务也对此表进行插入一条新数据,那么在第一个事务在后面就会发现还有未修改的数据。
(3)不可重复读:一个事务两次读到的同一条件数据的(内容)结果不同。比如在一个事务内,两次读同一数据。在第一次读完之后但是事务还没有结束时,另外一个事务也访问并修改同一数据。那么,在第一个事务中的第二次读数据时数据可能是不一样的。
2.隔离级别中 脏读、幻读、不可重复读的问题
隔离级别 | 脏读 | 幻读 | 不可重复读 |
READ UNCOMMITTED(读取未提交) | 存在 | 存在 | 存在 |
READ COMMITED (读已提交) | 不存在 | 存在 | 存在 |
REPEATABLE READ (可重复读) | 不存在 | 不存在 | 存在 |
SERIALIZABLE (串行化) | 不存在 | 不存在 | 不存在 |