引入事务的目的:事务会把数据库从一种一致状态转换成另一个一致状态。在数据库提交工作时,可以确保要么所有的修改都已经保存了,要么所有修改都没有保存
事务的特性
原子性:原子性是指整个数据库事务是不可分割的工作单位,只有使事务中所有的数据库操作执行成功,才算是整个事务成功。
一致性:是指事务将数据库从一种状态转变为下一种一致的状态。在事务的开始之前和事务的结束之后,数据库的完整性约束没有被破坏。
隔离性:一个事务的影响在该事务提交前对其他事务都不可见(这是通过锁来实现的)
持久性:事务一旦提交,结果就是永久性的,即使发生死机等故障,数据库也能将数据恢复
事务的实现
原子性,一致性,持久性通过数据库的redo和undo来完成
【redo】
事务日志通过重做(redo)文件和innodb存储引擎的日志缓冲来实现。当开始一个事务的时候,会记录该事务的一个日志序列号,当事务执行的时,会往innodb存储引擎的日志缓冲里插入数据;当事务提交时,必须将innodb存储引擎的日志缓冲写入磁盘。也就是说写数据之前,先写日志,这种日志称为预日志方式
Innodb存储引擎通过于写日志方式来保证事务的完整性,这意味着磁盘上存储的数据页和缓冲页是不同步的,对于内存缓冲中的页的修改,先是写入重做日志文件,然后再写入磁盘,因此是一种异步的方式
【undo】
利用undo信息可以将数据回滚到修改之前的样子。Redo存放在重做日志文件中,undo存放在数据库内部的一个特殊段。Undo段位于共享表空间