预2014版本SQL Server使用Transaction Level Delayed Durability的兼容性疑问
关于SQL Server低版本处理
COMMIT with (DELAYED DURABILITY = ON)的问题 好问题,我来帮你理清楚这个关键问题:SQL Server 2010(以及所有2014之前的版本)会直接报错,不会忽略这个参数,所以你必须做版本判断的分支逻辑,不能直接给所有客户部署同一代码。
具体行为拆解
- 预2014版本(比如你提到的2010)的反应:
DELAYED DURABILITY是SQL Server 2014才正式引入的语法特性,低版本的SQL Server完全不识别COMMIT语句后的with (DELAYED DURABILITY = ON)参数。执行这条语句时,会立刻抛出类似Incorrect syntax near the keyword 'with'.的语法错误,直接导致事务执行失败。 - SQL Server 2014及以上版本的行为:如果实例级没有开启延迟持久化(即
DELAYED_DURABILITY设置为DISABLED),执行COMMIT with (DELAYED DURABILITY = ON)时,这个参数会被安全忽略,事务会按照默认的完全持久化方式提交,不会报错;只有当实例级设置为ALLOWED或FORCED时,这个参数才会生效。
推荐的兼容解决方案:版本分支逻辑
既然要覆盖所有客户,你需要通过版本检查来执行不同的COMMIT语句。这里推荐用SERVERPROPERTY('ProductVersion')获取准确的内部版本号(比版本名称更可靠,避免客户自定义版本名的干扰):
BEGIN TRANSACTION -- 你的审计日志写入业务逻辑 ... -- 版本判断:仅在SQL Server 2014及以上版本(内部版本号以12开头)使用延迟持久化参数 IF CAST(LEFT(SERVERPROPERTY('ProductVersion'), CHARINDEX('.', SERVERPROPERTY('ProductVersion')) - 1) AS INT) >= 12 BEGIN COMMIT TRANSACTION WITH (DELAYED DURABILITY = ON) END ELSE BEGIN -- 低版本直接执行普通COMMIT COMMIT TRANSACTION END
额外注意事项
- 内部版本号对应参考:SQL Server 2008 R2(你提到的2010大概率是笔误)的内部版本号是10.5.x,SQL Server 2014是12.x,以此类推。
- 即使在2014+版本中,要让
DELAYED DURABILITY = ON生效,需要先在实例级别开启允许延迟持久化:ALTER DATABASE [你的数据库名] SET DELAYED_DURABILITY = ALLOWED;,否则参数依然会被忽略。
内容的提问来源于stack exchange,提问作者andyc209
相关产品推荐
相关产品推荐

