小编sec*_*age的帖子

当更新的记录写入 mdf 文件中的真实物理页面时?

我是 SQL Server 的初学者,只是关于事务的一些问题。我的课本上说:

检查点是一种周期性操作,它强制将当前使用的数据库的所有脏页写入磁盘

我很困惑,检查点是否将所有脏页写入日志文件 .ldf?

假设我们写了一些代码:

BEGIN TRAN T1;  
UPDATE table1 
SET postcode = '9000'
WHERE CustomerID = 1;

...
...
COMMIT TRAN T1; 
Run Code Online (Sandbox Code Playgroud)

因此,到执行“提交”时,table1 中的更新记录是否仍在缓存中并等待检查点将更新记录写入日志文件?将更新的记录写入磁盘(日志文件)后,如何将更新的记录写入到 mdf 文件中的真实物理页面?

sql-server transaction transaction-log

5
推荐指数
1
解决办法
182
查看次数

SQL Server 事务如何处理日志记录

我的课本上说:

从您开始事务时开始,您的更改与其他用户隔离。您正在做的事情只有您自己可以看到,并且在您 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)?

sql-server t-sql transaction transaction-log checkpoint

0
推荐指数
1
解决办法
119
查看次数