事务简介:一组操作集合,是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,这些操作要么同时成功,要么同时失败。
事务四大特性:
(1)原子性:事务不可分割,是最小操作单元,事务的所有操作要么同时成功,要么同时失败
(2)一致性:事务完成时,必须使所有数据保持一致状态
(3)隔离性:数据库提供的隔离机制,保证事务在不受外部并发操作影响的环境下运行
(4)持久性:事务一旦提交或回滚,他对数据库中的数据改变就是永久的
并发事务问题:
(1)脏读:一个事务读到另一个事务还没有提交的数据。
(2)不可重复度:一个事物先后读取同一条记录,但两次读取的数据不同
(3)幻读:一个事物按照条件查询数据,没有对应的数据行,但在插入是,又发现这行数据已经存在。
事务隔离级别:
(1)Read uncommitted:上述三个问题同时存在。
(2)Read committed:解决脏读。
(3)Repeatable Read:解决脏读和不可重复读。
(4)Serializable:解决上述所有问题。
事务隔离级别越高,数据越安全,但是性能越低。
事务原理:
原子性、一致性、持久化三个特性由两份日志保证,即redo log和undo log日志。
隔离性由数据库的锁和MVCC保证的。
(1)redo log,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。由redo log buffer和redo log file组成,前者在内存,后者在磁盘中,事务提交后前者通过后台线程提交到后者,用于刷新脏页到磁盘,发生错误时,进行数据恢复使用。
undo log,回滚日志,用于记录数据被修改前的信息,作用:提供回滚(保证原子性)和MVCC(多版本并发控制)。undo log是逻辑日志,他记录操作的反操作,例如,当delete一条记录,它记录一条对应的insert。
(2)MVCC(multi-version concurrency control),多版本并发控制,维护一个数据的多个版本,作用是让读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC具体实现,依赖于三个隐式字段、undo log、readView。
a.隐式字段,表结构的隐藏字段,
DB_TRX_ID:最近修改的事务ID、
DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本,回滚链、
DB_ROW_ID:隐藏主键,若没有指定主键,生成该隐藏字段
b.undo log
c.Read View:包含四个核心字段
m_ids:当前活跃的事务ID集合
min_trx_id:最小活跃事务ID
max_trx_id:预分配事务ID,当前最大事务ID+1
creator_trx_id:ReadView创建者的事务ID
根据这四个字段规定版本链数据的访问规则,不同的隔离级别,生成Read View的时机不同
RC:事务中每一次执行快照读时生成ReadView
RR:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。