事务的属性:
原子性(Atomicity):表示事务是不可分割的操作。操作要么不做,要么全做,不存在中间的状态
隔离性(Isolation):事务与事务之间是相互独立,互不影响。
一致性(Consistency):事务必须是从一个一致性状态到另一个一致性状态。与原子性密切相关
持久性(Durability):一旦事务提交,事务对数据库的操作就会永久保存。
事务的状态:
活动的(active):事务对数据库的操作正在执行中
部分提交的(partially committed):事务操作执行完成,但是结果还没有刷新到磁盘中。
失败的(failed):当事务处于 活动、部分提交状态,出现 断电或者人为停止当前事务
中止的(aborted):当事务进行回滚,并恢复到执行事务之前的状态
提交的(committed):由部分提交的状态的事务将修改的数据刷新到磁盘。
事务的隔离级别:
未提交读:可读取没有提交的数据,容易出现脏读、不可重复读、幻读
已提交读:可读取已经提交的数据,容易出现不可重复读、幻读
可重复读::通过MVCC的”快照“设置,避免”不可重复读“问题,但是可能会出现幻读
可串行化:规避所有问题。
MVCC版本链:
每次对记录进行修改,会形成一个由undo日志组成的链表。该链表的undo日志不仅包含修改的具体内容,还有记录进行修改的事务ID(事务ID是自增的)。
隔离级别为未提交读时,会读取版本链最新的记录,不会查询undo日志。
隔离级别为已提交读时,每次查询的时候都会生成一个“快照”的东西 ——readview。readview由四部分组成,列表:系统活跃的读写事务ID;最小的活跃事务ID;即将分配的事务ID;生成readview的事务ID(只读事务默认为0)。如果版本链的事务ID 大于 即将分配的事务ID,则不会获取该版本数据;如果版本链的事务ID 小于 最小的活跃事务ID 则会获取该版本的数据;如果版本链的事务ID介于 最小活跃事务ID与 即将分配的事务ID之间,则需要判断 该版本链是否 存在于系统活跃的事务ID列表中,存在则不可获取、不存在则可读取。
隔离级别为可重复读时,会在第一次查询数据时生成快照 readview。避免了每次读取数据不一致的情况。