ACID 是数据库的基本属性。其中的D是指"持久性":只要事务已经提交,对应的数据修改就会被保存下来,即使出现断电等情况,当系统重启后之前已经提交的数据依然能够反映到数据库中。

那么D特性是如何在SQL Server中实现的呢?SQL Server使用write-ahead logging的方式,保证日志记录会先于数据记录固化到磁盘中。当事务提交后,只有当日志记录固化到磁盘时,才会向客户端返回提交成功的消息,至于相应的数据记录,会通过异步的方式后续写入到磁盘中。如果在此期间发生断电等故障,那么就会出现以下两种情况:

  1. 日志已经写入到磁盘(committed),但数据没有写入:

    系统重启后进行redo操作,通过读取日志,来将没有固化到数据文件的信息写入到数据文件。

  2. 部分日志已经写入到磁盘(uncommitted),数据部分写入或没有写入

    系统重启后执行undo操作,将没有提交的事务对应的数据从数据文件中清除。

这样就保证了已经提交的事务不会丢失。

Delayed durability

SQL Server 2014中引入了一个新的特性,叫做Delayed durability(也称作lazy commit),颠覆了之前提到的概念。通过Delayed durability,可以让日志记录按照一定规律异步地写入到日志文件中,避免日志磁盘写入过于频繁。这样就以牺牲Durability来换取性能

应用场景:

使用该特性的前提是您的应用可以容忍一定程度的数据丢失。

日志磁盘出现系统瓶颈。

由于日志磁盘性能问题,导致事务无法提交,导致相应的资源(memory,lock等)无法释放引发的资源竞争

Delayed Durability有以下特性:

  1. 一旦事务提交,事务中的数据变更对其他事务(包含full durable transaction和delayed durability transaction)可见。具体请参考isolation level http://msdn.microsoft.com/en-us/library/dn133175.aspx
  2. 事务的持久性(durability)依赖于日志记录是否固化到磁盘。
  3. 内存中的日志记录只有在任意以下情况发生时才会固化到磁盘:
    1. )Full durable transaction进行了数据变更,并且commit.
    2. )执行了sp_flush_log存储过程.
    3. )Log buffer满了,日志记录也会固化到磁盘.

如果1)或2)出现两次,那么SQLSERVER会保证第一次之前的Delayed durability transaction的数据变更已经被固化到了磁盘。

如何使用Delayed durability

Delayed durability是一个数据库级别的特性,默认是禁用的,我们首先要开启这个选项。

ALTER DATABASE [DDtest] SET DELAYED_DURABILITY = FORCED|Allowed|Disabled

如果是forced,那么该数据库内所有的事务都强制使用delayed durability;如果是allowed,那么delayed durability和full durable transaction可以同时存在;如果是disabled,那么无法使用delayed durability.

当该属性发生变化后,errorlog中也会有相应的记录

Setting database option delayed_durability to forced for database 'DDtest'.

Setting database option delayed_durability to allowed for database 'DDtest'.

Setting database option delayed_durability to disabled for database 'DDtest'.

如果数据库的DELAYED_DURABILITY为Allowed,我们可以在语句级别进行控制,否则就要遵循数据库的设定了(如果语句的设定和数据库级别设定冲突,那么SQL Server会使用数据库级别的设定)。

事例

将数据的 DELAYED_DURABILITY设置为Allowed

ALTER DATABASE [DDtest] SET DELAYED_DURABILITY = Allowed

创建一张表,并循环插入1000行数据,每次插入都是一个单独的事务

create table ta(col int)

declare @N int=0

while @n<1000

begin

begin tran

insert ta values(1)

commit tran with(delayed_durability=off)

set @N+=1

print cast(@N as varchar(1000))

end

开启Process Monitor,监控对数据库日志文件的操作。

一共对日志文件进行了1012次的写入操作,也就是每次commit都会立刻固化到日志文件

下面比较一下使用delayed durability的情况

declare @N int=0

while @n<1000

begin

begin tran

insert ta values(1)

commit tran with(delayed_durability=on)

set @N+=1

print cast(@N as varchar(1000))

end

1000个事务只触发了32次写入,大大地减少了对日志文件的写入操作。

注意事项

  1. 当系统不忙时,也会主动将delayed durability的日志记录固化到磁盘。但目前不知道如何判断"不忙"这个标准。
  2. checkpoint不会将delayed durability的日志记录固化到磁盘。
  3. SQL Server正常关闭不会将delayed durability的日志记录固化到磁盘,也就说正常关闭也可能会导致数据丢失,建议之前先执行sp_flush_log

SQL 2014新特性- Delayed durability的更多相关文章

  1. SQL Server 2014 新特性——内存数据库

    SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...

  2. SQL Server 2014 新特性——内存数据库(转载)

    目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 内存优化表的索引 并发能力的提升 和竞争对手相比几点 ...

  3. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 撰写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源 ...

  4. 小心SQL SERVER 2014新特性——基数评估引起一些性能问题

    在前阵子写的一篇博文"SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享"里介绍了数据库从SQL SERVER 2005升级到 SQL SERVER ...

  5. SQL Server 2014新特性——Buffer Pool扩展

    Buffer Pool扩展 Buffer Pool扩展是buffer pool 和非易失的SSD硬盘做连接.以SSD硬盘的特点来提高随机读性能. 缓冲池扩展优点 SQL Server读以随机读为主,S ...

  6. SQL Server 2014 新特性:IO资源调控

    谈谈我的微软特约稿:<SQL Server 2014 新特性:IO资源调控> 2014-07-01 10:19 by 听风吹雨, 570 阅读, 16 评论, 收藏, 收藏 一.本文所涉及 ...

  7. SQL Server 2014新特性:五个关键点带你了解Excel下的Data Explorer

    SQL Server 2014新特性:五个关键点带你了解Excel下的Data Explorer Data Explorer是即将发布的SQL Server 2014里的一个新特性,借助这个特性讲使企 ...

  8. [SQL Server 2014] SQL Server 2014新特性探秘

    SQL Server 2014新特性探秘(1)-内存数据库   简介 SQL Server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了.去年我再西雅图参加SQ ...

  9. SQL Server 2014新特性探秘(3)-可更新列存储聚集索引

    简介      列存储索引其实在在SQL Server 2012中就已经存在,但SQL Server 2012中只允许建立非聚集列索引,这意味着列索引是在原有的行存储索引之上的引用了底层的数据,因此会 ...

随机推荐

  1. postgresql function 返回 select

    pq函数功能很强大,我打算把统计的功能都放在数据库端.优势让运算离数据更近一些,缺点无法服用代码.牺牲了django的灵魂性,项目必须依赖postgresql. 项目中,希望实现返回select内容 ...

  2. NSDate 格式化 NSDate to NSString

    NSLog(@"%@",[NSDate stringFromDate:[NSDate date] withFormat:@"yyyyMMdd__HH_mm_ss_zzz& ...

  3. CSS行高——line-height

    学习资料 : http://www.cnblogs.com/dolphinX/p/3236686.html

  4. php中的cookie用法

    cookie和session都可以暂时保存在多个页面中使用的变量,但是它们有本质的差别. cookie存放在客户端浏览器中,session保存在服务器上.它们之间的联系是session ID一般保存在 ...

  5. webapp设置适应pc和手机的页面宽高以及布局层叠图片文字

    <!DOCTYPE html> <html lang="zh-cn"> <head> <title>我趣旅行网-美剧迷</ti ...

  6. mysql 去重,跨表更新,跨表删除

    一.去重 1.查询出重复的记录 CREATE TABLE push_log_full_2013_10_30_tmp SELECT * FROM `push_log_full` WHERE time B ...

  7. 【转载】CentOS 6.3下rsync服务器的安装与配置

    一.rsync 简介 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录. Rsy ...

  8. 论Top与ROW_NUMBER读取第一页的效率问题

    10.29 前一段时间研究关于分页的问题,由于数据库属于百万级的,考虑了关于优化方面的问题.其中一个考虑是:第一页展现的频率肯定是最高的,所以我想第一页就使用Top N来读取. 这个想法本身是没有错, ...

  9. Xcode同时兼容Xcode7和Xcode8,两个版本并存,也适用于先升8再安装7

    先吐槽一下之前看到的一个教程,如下: 先在应用程序内,拷贝一份之前的xcode,然后再安装新版本,发现这种安装完成就是在之前上面迭代了  有木有?等于没任何作用 我这边就是不小心先升级了8,然后再安装 ...

  10. 项目搭建系列之一:使用Maven搭建SpringMVC项目

    约定电脑都安装了eclipse,且已配置好Maven以及eclipse插件. 1.Eclipse 2.maven 3.Eclipse 需要安装maven插件.url:maven - http://do ...