var*_*ble 2 sql-server data-pages transaction-log
当 INSERT 查询被触发时,SQL Server 将其记录在其日志中并向用户发送查询已完成的确认。同时它还更新数据页面。这两者(日志和数据页)都驻留在内存中。
无论恢复模式如何(简单、批量或完整),每当发生检查点时,SQL Server 都会将日志和脏页从内存刷新到磁盘。
问题:假设在向用户发送确认后、检查点之前发生电源故障,那么,由于内存中的日志尚未写入磁盘,即使用户已收到确认,此 INSERT 操作是否会丢失?这是否违反了 ACID 的持久特性?
\n\n问:这个INSERT操作会因为断电而丢失吗?
\n
对于主要问题 - 据我所知 - 请参阅 Itzik Ben-Gan 的优秀文章:Understanding log bufferlushes,其中除其他详细解释外,它指出:
\n\n\nSQL Server 强制事务持久性的方式部分是通过确保在将控制权返回给调用者之前将所有事务\xe2\x80\x99s 更改写入磁盘上的 数据库\xe2\x80\x99s 事务日志。如果在确认事务\xe2\x80\x99s 提交后发生电源故障,您知道所有这些更改至少都已写入磁盘上的事务日志。...
\n
其他问题/澄清:
\n\n\n问:那么日志先写入缓冲区并在检查点刷新到磁盘是什么意思?如果日志已经在磁盘上,那么将日志刷新到磁盘的目的是什么?
\n
A:日志缓冲区位于内存中。日志缓冲区刷新到磁盘的条件之一是:
\n\n\nSQL Server 收到更改数据的[完全持久]事务的提交请求。
\n
SQL Server 中的默认行为是完全持久的事务提交。这意味着在事务被确认为已提交之前,事务已硬化到磁盘。根据文档:
SQL Server 事务提交可以是完全持久的(SQL Server 默认值),也可以是延迟持久的(也称为延迟提交)。
完全持久的事务提交是同步的,并且仅在事务的日志记录写入磁盘后才将提交报告为成功,并将控制权返回给客户端。
--
延迟事务持久性是通过使用异步日志写入磁盘来实现的。事务日志记录保存在缓冲区中,并在缓冲区填满或发生缓冲区刷新事件时写入磁盘。
持久性可以在数据库级别、事务语句和本机编译的存储过程上显式设置。有关详细信息,请参阅链接的资源。
正如@ik_zelf 指出的,对于耐久性有一个警告。对于启用了写缓存的存储,当存储控制器将写操作存储在其缓存中时,我们将收到成功写入的确认。如果发生电源故障,写入可能会丢失。这就是磁盘控制器有 UPS 系统和电池支持的缓存模块的原因。
当然,如果日志文件存储在 RAM 驱动器上,那将是另外一种蠕虫病毒。