症状
请考虑以下情况:
-
你拥有在 SQL Server 2016 或 Azure SQL 数据库中 始终加密 的 Microsoft .net Framework 应用程序。
-
这些应用程序的列主密钥存储在 Azure Key Vault 中。
在此方案中,应用程序体验死锁。 因此,应用程序将停止响应(挂起)或超时。
在尝试获取或刷新 Azure Key Vault 的身份验证令牌的过程中,可能会发生死锁。
原因
当应用程序在数据库中查询加密的列时,SQL Server 的 .net Framework 数据提供程序将调用Azure Key 保管库提供程序以进行始终加密。这反过来会调用基于应用程序的异步任务,该任务获取或刷新 Azure Key Vault 的令牌。Azure Key Vault 提供程序中的此代码路径,用于始终加密的 NuGet 程序包版本2.0。 x 和 a.x 很容易出现死锁,因为它以不正确的方式调用某些异步方法。
解决方案
在始终加密版本2.1.0 的 Azure Key 保管库提供程序中,此问题首先已修复。如果你使用 Always encrypted 和 Azure 密钥保管库提供程序,我们强烈建议你重新生成和重新部署你的应用程序,以使其 对始终加密的版本2.1.0 或更高版本使用 Azure Key Vault 提供程序 。