小仙女讲InnoDB(3)——事务

概念

在这里插入图片描述
在事务中的操作,要么都做修改,要么都不做。其完全符合ACID的特性。

特性实现
原子性(Atomicity)redo log
一致性(consistency)undo log
隔离性(isolation)
持久性(durability)redo log

分类:

(1)扁平事务
这是使用最频繁的事务。所有操作都处于同一个层次,由begin work开始,commit work或rollback work结束。其间的操作都是原子的。

(2)带有保存点的扁平事务
在事务中添加一个保存点,以便当之后发生错误时,事务能回到保存点,而不用回滚到事务初始时。

(3)链事务
链事务也是在事务中添加一个保存点,和带有保存点的扁平事务不同的是,后者能回滚到任意正确的保存点,而链事务只能恢复到最近的一个保存点。

(4)嵌套事务
嵌套事务是大事务中嵌套着小事务。

(5)分布式事务
一个在分布式环境下运行的扁平事务

对长事务的操作

对于执行时间较长的事务,我们可以转化为小批量的事务来进行处理。每完成一个小事务,将结果放在一个特定表中,这样就能提高性能,也能查询此事务的执行进度。

实现

当事务提交时,必须先将该事务的所有日志写入到重做日志文件进行持久化,待事务的commit操作完成才算完成。重做日志文件分为两部分:redo log和undo log。

redo

redo恢复的是提交事务修改的页操作,通常是物理日志,记录的是页的物理修改操作。
redo log(重做日志)用来保证事务的持久性。

undo

undo回滚行记录到某个特定版本,是逻辑日志,根据每行的记录进行记录。
undo log(回滚日志)用来帮助事务回滚。

purge

purge用于最终完成delete和update操作。我们在进行delete或update操作后,不能马上对原有行进行处理,因为可能别的事务正在引用着这行。当进行purge操作时,会对该行记录进行判断,如果已不被任何其它事务引用,则可对其进行“真正删除”。
purge就像从“回收站”删除一个表或索引,此操作过后不能回滚和恢复。

group commit

事务提交时会进行两个操作:
(1)修改内存中事务对应的信息,并将日志写入重做日志缓冲
(2)调用fsync将确保日志都从重做日志缓冲写入磁盘
因为磁盘的fsync性能是有限的,所以数据库提供了group commit的功能,即一次fsync可以刷新确保多个事务日志写入文件。

事务相关语句

事务控制语句——葫芦娃7兄弟:

start transaction、begin:开启一个事务
commit:提交事务
rollback:回滚
savepoint identifier:在事务中创建一个保存点
release savepoint identifier:删除一个事务的保存点
rollback to [savepoint]identifier:回滚到保存点
set transaction:设置事务隔离级别(4种)

隐式提交的SQL语句:

有些sql语句执行完后,会有一个隐式的commit操作。比如create table、create index、drop user、set password等。

事务的隔离级别

事物的隔离级别分为:

(1)read uncommitted

读未提交,一个事务可以读取另一个未提交事务的数据。这也就是脏读。

(2)read comitted

读已提交,一个事务要等另一个事务提交后才能读取数据。此隔离级别下可以解决脏读的问题。但是会出现不可重复读的问题。

(3)repeatable read

可重复读,在事务开启时,不再允许修改操作。此隔离级别下,可以解决不可重复读问题,但是可能会出现幻读的问题。

(4)serializable

串行化,在此级别下,事务串行化顺序执行,可以避免脏读、不可重复读、幻读。但是这种事务隔离级别效率低下,一般不使用。

InnoDB的默认的事务隔离级别为repeatable read,此隔离级别下已经能完全保证事务的隔离性要求。

©️2020 CSDN 皮肤主题: 撸撸猫 设计师:设计师小姐姐 返回首页