数据库事务在提交之前数据是存在哪里的?

最佳答案

数据库的物理存储会分成许多个页(Page),记录都存储在页中,数据每一次IO,操作的最小单位是一个页。数据库运行时,会在内存中维护一个缓冲区(Buffer Pool)。缓冲区缓存部分的页(因为内存有限,所有不能把所有数据都缓存进来)。每次对数据的操作,都需要把磁盘中的页读入缓冲区,然后再进行操作;如果缓冲区中有对应的页,就不需要读磁盘。如果数据库要读入一个页,而此时需要缓冲区已经被用完了,这个时候就要替换出一个页面,腾出一块内存给新读入的页面。如果被换出的页被改过(在内存中每个页会有个Dirty标记,标识当前页面是否被修改过),就要把内存页写入到磁盘中。

数据库为了实现事务,需要并发控制和恢复机制。

恢复机制,可以用log实现,多采用steal(未提交的数据可以写入磁盘),no-force(提交的数据可以不写入磁盘)策略。

并发控制,现在的多数数据库用MVCC(MVCC+2PL或MVCC+SSI),由于steal、no-force策略,这个部分完全就相当于在内存中做,直接更新的是内存页中的元组。只有发生页换出,或是checkpoint(定期的刷脏页)时,才会写磁盘。

所以,不管提交之前还是提交之后,数据在内存中,或是被写入磁盘,都是有可能的。

补充说明下恢复机制。以上是针对存储元组的页面和缓冲区来说的,log还是要在接交时写入磁盘的,以保证已提交的事务是持久化的。

以MySQL为例,MySQL使用REDO和UNDO来实现log。其中,REDO 为了重做对数据更改保存的信息,用于恢复;UNDO 为了撤销对数据更改保存的信息,用于回滚。每一条REDO日志记录都有一个LSN(Log Sequence NO) 日志号,一个递增的64位整数,一个LSN表示一个redo log结构。

在三个阶段涉及到日志的操作,分别是写入数据时,事务提交时,数据库恢复时。

一)写入数据,以update为例, Insert与之类似

1.计算更新后tuple到原tuple的delta信息,把这个delta复制到rollback segment中的undo

2.写redo log,记录对rollback segment的更改

3.把buffer pool中的对应tuple更新成新值,把新值的rollback pointer指向第1部生成的undo

4.写redo log,记录对数据page的

5.将page改成dirty

二)事务提交

force log, flush当前事务的redo log到磁盘

三)数据库恢复

1.启动开始时检测是否发生崩溃

2.定位到最近的一个checkpoint

3.定位在这个checkpoint flush到磁盘的数据,检查checksum。如果不正确,说明这个页在上次写入是不完整的,从doublewrite buffer里把正确的page读出来,更新到buffer中的page

4.分析redo log,标识出未提交事务

5.顺序执行redo

6.rollback未提交的事务

相关问答

QUESTIONS AND ANSWERS

已经提交的事务即在进行update或insert操作后,进行了commit的操作。1、如,有以下两个语句:update test set&n...

查看更多

收起 ︿

给记录行设定状态序号和历史状态序号,更新前先设定状态序号,如果成功了就把这个状态序号给历史序号以表示提交,如果失败了就把原始数据给恢复过来以回滚。...

查看更多

收起 ︿

一组业务整体处理的行为叫一个事务。这一组的业务都能成功处理,我们就可以把这个事务提交来保存你已做的行为结果。但如果一组中有任何的差错出现的话,我们就认为这事务不...

查看更多

收起 ︿

这个问题的有趣之处,不在于问题本身(“原子性、一致性的实现机制是什么”),而在于回答者的分歧反映出来的另外一个问题:原子性和一致性之间的关系是什么?我特别关注了...

查看更多

收起 ︿

服务器数据恢复如何使用事务日志恢复SQL Server数据库本文关键词:Tim Chapman数据库备份数据库事务日志备份SQL ...

查看更多

收起 ︿

前滚是未完全提交的事务,如果这时候数据库崩溃了或者断电了,重新开机启动数据库时,就需要用前滚来完成事务的完全提交,即将先前那部分已经提交了还在内存里的块写入到磁...

查看更多

收起 ︿

3、sql server数据库的数据还原前提是你做过备份打开sql server1、右击需要还原的数据库-任务-还原-数据库2、选择源设备-右边的文件选择3、在...

查看更多

收起 ︿

注意看报错信息啊sqlalchemy.exc.OperationalError: (OperationalError) no such table: user ...

查看更多

收起 ︿

DB2数据库事务日志已满问题解决方案本系列文章主要介绍数据库管理员(DBA)在日常维护中遇上一些比较紧急的情况如何处理,本篇主要介绍DB2交易日志存储空间满问题...

查看更多

收起 ︿