Mysql技术内幕InnoDB存储引擎读书笔记--《七》事务

来源:互联网 发布:mac装win8还是win10 编辑:程序博客网 时间:2024/06/01 08:04

事务的ACID四个特性,原子性,一致性,隔离性,持久性,这些已经老生常谈了,就不必说。

事务的实现

redo

在InnoDB存储引擎中,事务日志通过重做(redo)日志文件和InnoDB存储引擎的日志缓冲(InnoDB Log Buffer)来实现。当开始一个事务时,会记录该事务的一个LSN(Log Sequence Number,日志序列号);当事务执行时,会往I浓浓DB存储引擎的日志缓冲里插入事务日志;当事务提交时,必须将InnoDB存储引擎的日志缓冲写入磁盘(默认的实现,即innodb_flush_log_at_trx_commit=1)。也就是在写数据前,需要先写日志。这种方式称为预写日志方式(Write-Ahead
-Logging,WAL)。

InnoDB存储引擎通过预写日志的方式来保证事务的完整性。这意味着磁盘上存储的数据页和内存缓冲池中的页是不同步的,对于内存缓冲池中页的修改,先是写入重做日志文件,然后再写入磁盘,因此是一种异步的方式。

undo

undo是用来利用undo信息将数据回滚到修改之前的样子。与redo不同的是,redo存放在重做日志文件中,undo存放在数据库内部的一个特殊段(segment)中,这称为undo段(undo segment),undo段位于共享表空间内。

由于别的事务也会修改数据,所以InnoDB存储引擎回滚时,实际上是做相反的操作,对于每个INSERT进行DELETE,对于每个UPDATE执行一个相反的UPDATE,将修改前的行放回去。而不是直接全局回滚,这回影响到其他事务的数据。

对于事务操作的统计

InnoDB存储引擎应该关注的点:每秒请求书(QPS),每秒事务处理能力(Transaction Per Second,TPS)。

分布式事务

如一个用户需要从上海转10000元到北京的一个用户上:

#Bank@Shanghaiupdate account set money = money - 10000 where user = 'David';#Bank@Beijingupdate account set money = money + 10000 where user = 'Mariah';

分布式事务由一个或者多个资源管理器(Resource Managers)、一个事务管理器(Transaction Manager)以及一个应用程序(Application Program)组成。

  • 资源管理器:提供访问事务资源的方法。通常一个数据库就是一个资源管理器。
  • 事务管理器:协调参与全局事务中的各个事务。需要和参与全局事务中的所有资源管理器进行通信。
  • 应用程序:定义事务的边界,指定全局事务中的操作。

分布式事务使用二阶段提交(tow-phase commit)的方式。在第一个阶段,所有参与全局事务的节点都开始转呗(PREPARE),告诉事务管理器他们准备好提交了。第二个阶段,事务管理器告诉资源管理器执行ROLLBACK还是COMMIT。如果任何一个节点显示不能提交,则所有的节点都被告知需要回滚。

阅读全文
0 0