第七章:事务

认识事物

事务可以由简单SQL语句组成,也可以由一组SqL语句组成。对于事务的操作,要么都成功,要么都不成功。

ACID

A:原子性。要么都成功,要么都不成功。

C:一致性。事务开始和结束,数据库的完整性约束没有被破坏。

I:隔离性。某个事务提交之前对别的事务不可见,锁实现。

D:持久性。事务一旦提交,结果就是永久性的。持久性保证的是高可靠性,而不是高可用性。

分类

扁平事务:所有操作都是同层次的,原子性。

带有保存点的事务:允许事务回滚到之前的某一状态。

链事务:带有保存点的事务当系统崩溃时,所有保存点都会丢失。链事务是指提交一个事务将他隐式传给下一个事务。

嵌套事务:由上层事务控制着各层事务。

事务的实现

redo log保证事务的原子性和持久性。undo log保证事务的一致性。

redo是物理日志,记录对页的修改操作保证事务的持久性。undo是逻辑日志,记录更改前,帮助事务回滚和实现MVCC。

redo

重做日志缓存,重做日志文件。

为了确保每次日志都写入重做日志文件,在每次将重做日志缓冲写入重做日志文件后,InnoDB存储引擎都需要调用一次 fsync操作。由于重做日志文件打开并没有使用O_DIRECT选项,因此重做日志缓冲先写入文件系统缓存。为了确保重做日志写入磁盘,必须进行一次 fsync操作。由于fsync的效率取决于磁盘的性能,因此磁糕的性能决定了事务提交的性能,也就是数据库的性能。

 redo log和binlog的区别

重做日志是在InnoDB存储引擎层产生,而二进制日志是在MySQL数据库的上层产生的,并且二进制日志不仅仅针对于InnoDB存储引擎,MySQL数据库中的任何存储引擎对于数据库的更改都会产生二进制日志。
MySQL数据库上层的二进制日志是一种逻辑日志,其记录的是对应的SQL语句。而InnoDB存储引擎层面的重做日志是物理格式日志,其记录的是对于每个页的修改。
此外,两种日志记录写入磁盘的时间点不同。二进制日志只在事务提交完成后进行一次写入。而InnoDB存储引擎的重做日志在事务进行中不断地被写入,这表现为日志并不是随事务提交的顺序进行写入的。

log block

每块大小512字节。log buffer由log block组成。递增循环使用。

log group重做日志组:

由多个重做文件构成。在InnoDB存储引擎运行过程中,log buffer根据一定的规则将内存中的 log block刷新到磁盘。这个规则具体是:
事务提交时;当log buffer中有一半的内存空间已经被使用时;log checkpoint时。

LSN:记录redo log的数量。

LSN不仅记录在重做日志中,还存在于每个页中。在每个页的头部,有一个值FILPAGE_LSN,记录了该页的LSN。在页中,LSN表示该页最后刷新时LSN的大小。因为重做日志记录的是每个页的日志,因此页中的LSN用来判断页是否需要进行恢复操作。

undo

undo存放在数据库内部一个特殊段中。undo位于共享表空间。

一个事务的回滚不能影响别的事务。

undo用于MVCC:当用户读取某一行记录时,该记录被别的事务占用,可以通过undo来读取之前的行版本记录,以此实现非锁定读。

事务提交后不能立马删除undo log和其所在的页。因为可能还有别的事务需要undo log获得行记录之前的版本。事务提交时要将undo log放入一个链表中,是否删除由purge线程决定。

insert undo log可以在事务提交后直接删除,不需要purge。

update undo log包括delete,update操作,要将undo log放入一个链表中,是否删除由purge线程决定。

purge

purge用于最终完成delete和 update操作。这样设计是因为InnoDB存储引擎支持MVCC,所以记录不能在事务提交时立即进行处理。这时其他事物可能正在引用这行,故InnoDB存储引擎需要保存记录之前的版本。而是否可以删除该条记录通过purge来进行判断。若该行记录已不被任何其他事务引用,那么就可以进行真正的delete操作。
在前一个小节中已经介绍过,为了节省存储空间,InnoDB存储引擎的undo log 设计是这样的:一个页上允许多个事务的undo log存在。虽然这不代表事务在全局过程中提交的顺序,但是后面的事务产生的undo log总在最后。此外,InnoDB存储引擎还有一个history列表,它根据事务提交的顺序,将undo log进行链接:InnoDB存储引擎的设计中,先提交的事务总在history列表尾端。undo page存放了undo log,由于可以重用,因此一个undo page中可能存放了多个不同事务的undo log。

InnoDB存储引擎这种先从 history list中找undo log,然后再从undo page中找undolog 的设计模式是为了避免大量的随机读取操作,从而提高purge的效率。

事务控制语句自动提交

隐式提交

对于事务操作的统计

只记录显示提交。不记录回滚和隐式提交。

事物的隔离级别

等下写

 


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值