而从SQL Server 2014开始,我们引入了一个新的特性——Delayed Durability Transactions(DTD)。这个技术可以使得SQL Server在提交事务时,无需等待事务日志写入磁盘就直接返回事务提交成功的信号,I/O操作在后台会以异步的方式写入到数据库事务日志文件中。这样好处是,事务可以去除等待I/O操作完成所带来的延时,以此来提高整个SQL Server的性能。在这整个过程中,SQL Server会在内存中专门开辟出一个特殊的Log Buffer来存放DTD所产生的日志,当这个Log Buffer一旦存满之后会马上写入日志文件,由此将零散的I/O操作变成了一块一块的操作来提高效率,增加吞吐量。
虽然,DTD能提高系统的性能,但是,可以看到,它的缺点也是显而易见的。由于数据是以内存为载体,如果SQL Server crash,那部分还没有来得及写入到磁盘的日志数据就会丢失。导致之前提交的记录在数据库重启之后消失。这样,会使得前端应用(用户)产生不好的体验。同时,这个也从违反了ACID中的Durability这个特性。因此,我们需要根据业务的实际需要来确定是否启用该功能。通常,我们建议在以下几种情况下来使用这个功能:
- 可以容忍部分的数据丢失
- 系统中存在极为严重的Log Write等待
在SQL Server 2014中,我们有3种方式来控制什么时候使用DTD:
- Database level control——数据库级别来控制所有的事务是否需要启用DTD
- Atomic block level control——Native SP级别来控制是否需要启用DTD
- COMMIT level control ——T-SQL级别来控制是否需要启用DTD
当三种级别混合使用的时候,会有不同的结果:
最后,我们再来介绍一下“sp_flush_log”,该存储过程是SQL Server 2014引入的一个新的系统存储过程。它的作用是将当前数据库的事务日志刷新到磁盘上,可以保证所有之前提交的DTD事务都是持久的,以此确保数据不会丢失。由于,从内存的Buffer写入到磁盘上的日志文件这个动作都是由SQL Server来自动控制的,所以,如果我们想保证日志最多只丢失多少时间的数据,也可以创建一个Job来定时的执行这个存储过程。这样可以人为来控制这个写入动作。
这就是今天的分享,更多SQL 2014新功能介绍请持续关注本博客。 下周我们将会介绍SQL 2014 I/O资源调控器这个新特性。
转载自:微软亚太区数据库技术支持组官方博客
http://blogs.msdn.com/b/apgcdsd/archive/2014/12/04/sql-2014-4-delayed-durability-transactions.aspx