事务:保证数据库的一组操作要么全部成功,要么全部失败。mysql中事务是在存储引擎层实现的,Innodb是mysql支持事务的存储引擎
ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)
ACID
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性 (Isolation)
- 持久性 (Durability)
事务隔离级别
事务隔离级别越高,效率越低。
- 读未提交:一个事务还未提交,它所做的修改就能被看到
- 读已提交:一个事务提交后,它所做的修改才能被看到
- 可重复读:一个事务执行中看到的数据,和他在启动是看到的是一致的
- 串行化:“读”加读锁,“写”加写锁,一个事务未完成之前,后面开启的事务都会发生锁冲突。
事务不同隔离级别的实现方式 —— 视图
记录在更新时会同时产生一条回滚日志,不同时间启动的事务,可以根据这些回滚日志产生不同的视图,这样就能保证读到不同的值。而不同的隔离级别,产生视图的时机不同:
- 读未提交:没有产生视图,直接读取记录的值,这种情况成为脏读
- 读已提交:视图是在每条SQL执行时产生的,所以就能已提交的事务。一个事务两次读同一个值可能不一样,称之为不可重复读。
- 读未提交:视图是在事务启动时产生,因此在事务期间看到的值是相同的。
- 串行化: 直接加锁,避免并行访问。
幻读:即使再可重复读的隔离级别下,一个事务按照相同的查询条件,仍然可能发现其他事务插入了满足其查询条件的数据。
事务开启方式
- 显示启动:begin(start transaction),commit或者roll back
- 隐式启动:set autocommit=1
问题1:为什么需要避免长事务
回滚日志会一直保留,知道没有比它更早的视图存在,所以长事务会导致回滚日志一直存在。