【数据库系统】考虑题4所示的日志记录,假设开始时A、B、C的值都是0 (1) 如果系统故障发生在14之后,写出系统恢复后A、B、C的值

本文通过实验探讨了数据库事务的特性,特别是在系统故障后的恢复机制。详细分析了不同故障发生点对事务处理的影响,得出结论关于事务独立性及故障恢复后的数据状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

T5.考虑题4所示的日志记录,假设开始时A、B、C的值都是0

1. 实验 Transaction 性质

2. 实验结论

3. 题目

3.1 如果系统故障发生在14之后,写出系统恢复后A、B、C的值

3.2. 如果系统故障发生在12之后,写出系统恢复后A、B、C的值

3.3 如果系统故障发生在10之后,写出系统恢复后A、B、C的值

3.4 如果系统故障发生在9之后,写出系统恢复后A、B、C的值

3.5 如果系统故障发生在7之后,写出系统恢复后A、B、C的值

3.6 如果系统故障发生在5之后,写出系统恢复后A、B、C的值


T5.考虑题4所示的日志记录,假设开始时A、B、C的值都是0

1. 实验 Transaction 性质

首先做实验研究下transaction之间影不影响。这个很困扰我。

 

 

现在数据已经到了磁盘中,并重新读到内存为0,0,0。

下面测试一下事务的ROLLBACK怎么工作的。

关闭嵌套事务自动提交:

时刻1 & 2,开始事务T1,更新A 在内存中的值Set A, A=10:

此时刷新表test_rollback:

因为没有commit,所以A的值没有改变。

 

 

时刻3:事务 T2 开始

很可惜,一创建新的transaction,之前的事务就被强制提交了。

这种测试方法无法得到结论。

也许可以创建两个数据库连接来测试一下,console一个,navicat一个:

首先还原A的值:

然后在navicat中也创建一个transaction:

这样就有了两个transaction了:

然后再从头来模拟一下一个事件:

需要验证的问题是如果两个事务A,B之间已经产生了嵌套:

再来一遍:

T1:transaction navicat set A = 10;

刷新一下,可以看到此时没有更新:

T2: transaction navicat set b = 10;

Transaction console set c = 10;

刷新一下表,发现仍然没有更新,这次也没有发生强制更新的情况:

T3: transaction navicat rollback;

T4: transaction console commit;

刷新,发现:

此时C依然被更新成功,得到结论:

2. 实验结论

  1. rollback只会取消对应transaction的操作,不影响其他transaction的正常操作
  2. 事务之间相互是独立的,不要在同一块内存上考虑,因为有数据库锁机制在保护。

 

 

3. 题目

3.1 如果系统故障发生在14之后,写出系统恢复后A、B、C的值

T1, T2, T3重做,T4撤销。

相当于T1,T2,T3有效,T4无效。

等效于下图中T13的状态:

 

而T2自己回滚了且成功回滚,所以等效于删了T2,所以可以进一步简化为:

 

                                                                                                        

从头到尾推理一遍,所有值都取最新的,可以得到:A = 8,B = 7, C = 11。

3.2. 如果系统故障发生在12之后,写出系统恢复后A、B、C的值

T1, T2重做,T3, T4撤销。

相当于T1, T2 有效,T3, T4无效。

T2回滚没影响删掉,最终等效于下图对应的状态:

 

 

也就是等效于只有T1,所以A = 10, B = 0, C = 11。

 

3.3 如果系统故障发生在10之后,写出系统恢复后A、B、C的值

T3,T4撤销,T1重做。

此时T2回滚成功,相当于T2没有发生,此时也可以等效为只有T1:

 

 

所以答案和第二问相同,依然是A = 10, B=0, C=11。

 

3.4 如果系统故障发生在9之后,写出系统恢复后A、B、C的值

此时T2 回滚失败,T2全部撤销,此时也可以等效为只有T1:

 

 

所以答案仍然为A = 10, B = 0,C = 11。

3.5 如果系统故障发生在7之后,写出系统恢复后A、B、C的值

答案为A = 10, B = 0,C = 11不变,理由同(4)。

3.6 如果系统故障发生在5之后,写出系统恢复后A、B、C的值

此时T1,T2,T3,T4全部撤销,等效于没有有效事务发生。

答案为 A=0, B=0,C=0。

### 数据库系统工程师下午练习及相关解答 #### 关于数据库恢复的典型目 以下是针对软考数据库系统工程师考试中涉及的数据库恢复部分的一道经典案例分析及其解答: --- **目:** 某公司数据库因硬件故障导致数据丢失,管理员尝试通过备份文件和日志文件进行恢复。已知该公司的数据库采用的是基于事务的日志记录机制,并且最近一次完全备份是在三天前完成的。 请根据以下情况设计合理的恢复方案并说明理由: 1. 如果当前只有完整的备份文件,没有增量备份或差异备份; 2. 如果有完整的备份文件、差异备份以及后续的操作日志文件; 假设数据库支持两种恢复模式:简单恢复模式和完整恢复模式。 --- **解答:** 对于上述问,可以从以下几个方面展开讨论: #### 方案一:仅具备完整备份的情况 在这种情况下,由于缺乏增量备份或差异备份的支持,只能依赖最新的完整备份来重建整个数据库环境。此方式虽然能够一定程度上减少数据损失,但由于间跨度较大(本例为三天),可能会造成较多的数据不可用。因此建议尽可能缩短两次全量备份之间的间间隔以降低风险[^1]。 ```sql -- 使用SQL Server为例演示如何执行基本还原操作 RESTORE DATABASE YourDatabaseName FROM DISK='C:\Backup\FullBackup.bak' WITH REPLACE; GO ``` #### 方案二:拥有完整备份、差异备份及操作日志的情形 当同存在以上三种类型的备份资料,则可按照如下顺序实施精确至某一刻点的状态重构工作流程——先加载基础镜像副本再依次施加各阶段变更记录直至目标间节点为止[^2]。 具体步骤如下所示1. 利用最新可用的整体存档重新初始化目的端实例。 2. 应用差额更新集补充其间产生的变动内容。 3. 结合联机日记条目重现最后段内的活动轨迹直到指定截止日期/事件发生瞬间结束位置处停止进一步重播动作防止覆盖尚未保存下来的原始状态信息。 ```sql -- 步骤1: 还原完整备份 RESTORE DATABASE YourDatabaseName FROM DISK='C:\Backup\FullBackup.bak' WITH NORECOVERY; -- 步骤2: 添加差异备份 RESTORE DATABASE YourDatabaseName FROM DISK='C:\Backup\DifferentialBackup.trn' WITH NORECOVERY; -- 步骤3: 恢复到特定间点 (例如 2024-03-07T15:00:00) RESTORE LOG YourDatabaseName FROM DISK='C:\Backup\LogBackup_*.trn' WITH STOPAT='Mar 7, 2024 3:00PM', RECOVERY; ``` --- ### 总结 在面对不同条件下的数据库恢复挑战,合理选用相应的策略至关重要。无论是单纯依靠定期制作整体映射还是综合运用多级防护措施相结合的方式都能有效提升应对突发状况的能力水平。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值