以下摘录来自Oracle 概念。也许这是一个愚蠢的问题,但我真的需要你的帮助来理解它。
我的问题是:
谢谢大家!英语不是我的母语,我觉得完全理解这一点有点困难。
When Oracle Database Initiates Checkpoints
The checkpoint process (CKPT) is responsible for writing checkpoints to the data file
headers and control file. Checkpoints occur in a variety of situations. For example,
Oracle Database uses the following types of checkpoints:
? Thread checkpoints
^^^^^^
The database writes to disk all buffers modified by redo in a specific thread before
^^^^^^^^^^^^^^^^^^^^
a certain target. The set of …
Run Code Online (Sandbox Code Playgroud) 当我查看生产 SQL Server 2016 的服务器日志时,我看到多个条目:
[信息] 数据库 ID:[5]。正在删除不可恢复的检查点表行(id:294)。
对于每个条目,末尾的 id 加 1。
我用谷歌搜索了这个错误,实际上没有任何关于它的信息。这个条目是什么意思?听起来相当不祥。
使用fn_dblog
我可以获得我的数据库的在线事务日志的活动部分。
但是在每个检查点之后,我只能看到 2 个条目显示检查点的开始和检查点LOP_BEGIN_CKPT
的结束LOP_END_CKPT
。
我想知道之前的日志是在每个检查点之后删除还是只是因为dbi_checkptLSN
位于引导页面中的值指示最新的 LSN而被忽略?
如果dbi_checkptLSN
是我能够移动该指标的结果,如果是,如何移动?
如果没有,并且没有删除日志,我如何访问以前的日志?
我的课本上说:
从您开始事务时开始,您的更改与其他用户隔离。您正在做的事情只有您自己可以看到,并且在您 COMMIT 之前不会真正完成——尽管在您看来是真实的,但只有您才能看到结果。任何其他试图查看的人,他们都可以看到旧值,或者如果他们大胆,他们可能会得到脏读。
我很困惑,所以我将使用下面的图片提出一些问题:
和 t-sql 代码是
BEGIN TRAN
UPDATE checking
SET Balance = Balance - 1000
WHERE Account = 'Sally' // original balance is 2000
--------------a checkpoint occurs ---------
UPDATE savings
SET Balance = Balance + 1000
WHERE Account = 'Sally'
COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)
并且我们知道,只有在执行了“COMMIT TRAN”之后,才会在日志缓冲区中创建描述 COMMIT 的新日志记录。
Q1- 为什么在 COMMIT 之前结果只对我可见? 假设在检查 sally 为负 -1000 后发生检查点,并且更新的记录位于第 4 页(内存中),因为它尚未提交,因此不会有日志记录日志缓冲区,因此磁盘(.ldf)中不会有相应的日志记录,但缓存第4页将写入磁盘(.mdf),因此任何用户都可以看到该记录的最新更改?
Q2-这种情况下事务控制如何保持原子性?
正如我所讨论的,当检查点发生时,第 4 页(在缓存中,包含记录的最新余额值:1000)将被写入磁盘,如果出现系统故障立即。SQL server重启后,.ldf文件中没有日志记录,如何知道如何将记录的余额(当前为1000)恢复到原来的值(余额为2000)?