事务是一组原子性的SQL查询语句,也可以被看做一个工作单元。如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都不会执行。也就是说,事务内的语句要么全部执行,要么一句也不执行。
事务的特性:acid,也称为事务的四个测试(原子性,一致性,隔离性,持久性)
automicity:原子性,事务所引起的数据库操作,要么都完成,要么都不执行
consisitency:一致性,事务执行前的总和和事务执行后的总和是不变的
isolation:隔离性, 某个事务的结果只有在完成之后才对其他事务可见
durability:持久性,一旦事务成功完成,系统必须保证任何故障都不会引起事务表现出不一致性
事务的状态:
活动
部分提交
失败
中止
提交
事务在某一时刻,一定处于上边五种状态中的一种,事务各状态之间的转换如下所示:

事务并发导致的问题
脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新了原有的数据。
幻读(Phantom Read):在一个事务的两次查询中数据不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
并发控制
多版本并发控制: Multiversion concurrency control,MVCC
每个用户操作数据时都是源数据的时间快照,当用户操作完成后,依据各快照的时间点在合并到源数据中
锁:要想实现并发控制,最简单的实现机制就是锁(MVCC采用的不是锁机制)。
读锁:共享锁,由读表操作加上的锁,加锁后其他用户只能获取该表或行的共享锁,不能获取排它锁,也就是说只能读不能写
写锁:独占锁,由写表操作加上的锁,加锁后其他用户不能获取该表或行的任何锁
锁粒度:从大到小,MySQL服务器仅支持表级锁,行锁需要存储引擎完成。
表锁:锁定某个表
页锁:锁定某个页
行锁:锁定某行
粒度越精细,并发性越好。即行锁的并发性最好,但需要存储引擎的支持。
事务的四种隔离级别
读未提交(read uncommitted): 允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
读提交(read committed): 只能读取到已经提交的数据。oracle等多数数据库默认都是该级别
可重读(repeatable read): 在同一个事务内的查询都是事务开始时刻一致的,innodb的默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
可串行(serializable): 完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
在MySQL中,在并发控制情况下,不同隔离级别分别有可能产生问题如下所示: