事务控制如何保持原子性

时间:2019-06-29 22:08:55

标签: sql-server transactions

假设我们有以下sql代码:

BEGIN TRAN
UPDATE checking
 SET Balance = Balance - 1000
 WHERE Account = 'Sally'    // original balance is 2000
--------------a checkpoint occurs ---------
--------------System Failure---------------
UPDATE savings
 SET Balance = Balance + 1000
 WHERE Account = 'Sally'
COMMIT TRAN

enter image description here

比方说,检查sally为负-1000之后会出现一个检查点,让我们将更新后的记录放在第4页(在内存中),因为尚未提交,因此不会有日志记录在日志缓冲区中,因此disk(.ldf)中将没有相应的日志记录。并立即发现系统故障。 SQL Server重新启动后,由于.ldf文件中没有日志记录,它如何知道如何将记录的余额(当前为1000)恢复到其原始值(余额为2000)?因为需要提交才能在内存dba.stackexchange.com/a/76080/184172中创建日志记录,答案是:

提交会在内存中将描述COMMIT的新日志记录添加到日志中

0 个答案:

没有答案