Áp dụng cho
Microsoft BitLocker Administration and Monitoring 2.5

Triệu chứng

Khi nhiều khách hàng kết nối cơ sở dữ liệu Microsoft BitLocker quản trị và giám sát 2.5 phục hồi, SQL gián đoạn có thể xảy ra trong cơ sở dữ liệu. Do đó, khoá không thể khôi phục từ cổng thông tin trợ giúp hoặc tự cổng dịch vụ. Khách hàng mới sẽ nhận được lỗi khi họ cố gắng mã hóa như dịch vụ MBAM trở nên không thể kết nối. Điều này khiến hết thời gian chờ và các lỗi khác.Ngoài ra, các lỗi sau đây xuất hiện trong Nhật ký theo dõi svc MBAM c:\inetpub\Microsoft BitLocker quản lý Solution\Logs\Recovery và phần cứng Service\ * .svclogs:

Giao dịch (quá trình ID 63) deadlocked khóa tài nguyên với một tiến trình và đã được chọn là nạn nhân gián đoạn. Chạy lại giao dịch.  Uncommittable giao dịch được phát hiện vào lô. Giao dịch trở lại.

Giải pháp

Để khắc phục sự cố, Cập nhật các quy trình được lưu trữ liên quan đến MBAM khôi phục cơ sở dữ liệu. Để thực hiện việc này, hãy chạy lệnh Transact-SQL sau:

USE [MBAM Recovery and Hardware]GO/****** Object:  StoredProcedure [RecoveryAndHardwareCore].[GetDomainId]    Script Date: 05/09/2014 07:58:22 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:      <Kirill Tropin>-- Create date: <6/18/2010>-- Description: <Returns DomainId for provided Domain Name. If domain isn't saved - will add it.>-- =============================================ALTER PROCEDURE [RecoveryAndHardwareCore].[GetDomainId]    @DomainName nvarchar(255)WITH EXECUTE AS OWNERASBEGIN     -- Validating input parameters    IF (@DomainName IS NULL)    BEGIN        RETURN -1    END    -- Adding domain if needed and returning DomainId    DECLARE @OrigTranCount int    SET @OrigTranCount = @@TRANCOUNT    IF @OrigTranCount > 0        SAVE TRAN myTran    ELSE        BEGIN TRAN    BEGIN TRY        DECLARE @DomainId int        SET @DomainId = (                        SELECT Id                        FROM Domains                        WITH (READPAST)     -- If a committed domain exists then get it, otherwise returns NULL                        WHERE (Domains.DomainName = @DomainName)                        )        -- Inserting Domain since it wasn't there        IF (@DomainId IS NULL)        BEGIN            /*            In the unlikely event that two clients simultaneously insert the same new domain,            we can end up with a race condition as they both attempt to insert the domain.            One of them will get an exception (error code 2627) due to the unique constraint            and should use this to trigger a re-read of the domain.            */            WHILE @DomainId IS NULL            BEGIN                BEGIN TRY                    INSERT INTO Domains WITH (ROWLOCK, UPDLOCK)                                (DomainName)                    VALUES      (@DomainName)                    SET @DomainId = @@IDENTITY                END TRY                BEGIN CATCH                    DECLARE @ErrorNumber INT                    DECLARE @ErrorSeverity INT                    DECLARE @ErrorState INT                    SELECT @ErrorNumber = ERROR_NUMBER(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE()                    IF @ErrorNumber = 2627                    BEGIN                        SET @DomainId = (                            SELECT Id                            FROM Domains                            WITH (READCOMMITTED)                            WHERE (Domains.DomainName = @DomainName)                            )                    END                    ELSE                    BEGIN                        RAISERROR (@ErrorNumber, @ErrorSeverity, @ErrorState)                    END                END CATCH            END        END        IF @OrigTranCount = 0            COMMIT TRAN    END TRY    BEGIN CATCH        IF @OrigTranCount = 0            ROLLBACK TRAN        ELSE             IF XACT_STATE() <> -1                ROLLBACK TRAN myTran        DECLARE @ErrorMessage1 NVARCHAR(4000);        DECLARE @ErrorSeverity1 INT;        DECLARE @ErrorState1 INT;        SELECT @ErrorMessage1 = ERROR_MESSAGE();        SELECT @ErrorSeverity1 = ERROR_SEVERITY();        SELECT @ErrorState1 = ERROR_STATE();        RAISERROR (@ErrorMessage1, -- Message text.                   @ErrorSeverity1, -- Severity.                   @ErrorState1 -- State.                   );    END CATCH    RETURN @DomainIdEND 

USE [MBAM Recovery and Hardware]GO/****** Object:  StoredProcedure [RecoveryAndHardwareCore].[GetDomainId]    Script Date: 05/09/2014 14:06:14 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:      <Kirill Tropin>-- Create date: <6/18/2010>-- Description: <Returns DomainId for provided Domain Name. If domain isn't saved - will add it.>-- =============================================ALTER PROCEDURE [RecoveryAndHardwareCore].[GetDomainId]    @DomainName nvarchar(255)WITH EXECUTE AS OWNERASBEGIN     -- Validating input parameters    IF (@DomainName IS NULL)    BEGIN        RETURN -1    END    -- Adding domain if needed and returning DomainId    DECLARE @OrigTranCount int    SET @OrigTranCount = @@TRANCOUNT    IF @OrigTranCount > 0        SAVE TRAN myTran    ELSE        BEGIN TRAN    BEGIN TRY        SET NOCOUNT ON        -- Use a merge statement to guarantee that the domain will be in the table        -- when the SELECT statement is called to get it.        MERGE Domains WITH (HOLDLOCK)        USING (SELECT @DomainName as DomainName) AS NewDomain        ON Domains.DomainName = NewDomain.DomainName        WHEN NOT MATCHED THEN            INSERT (DomainName)                VALUES (NewDomain.DomainName)        ;        DECLARE @DomainId int        SET @DomainId = (                        SELECT Id                        FROM Domains                        WHERE Domains.DomainName = @DomainName                        )        IF @OrigTranCount = 0            COMMIT TRAN    END TRY    BEGIN CATCH        IF @OrigTranCount = 0            ROLLBACK TRAN        ELSE             IF XACT_STATE() <> -1                ROLLBACK TRAN myTran        DECLARE @ErrorMessage1 NVARCHAR(4000);        DECLARE @ErrorSeverity1 INT;        DECLARE @ErrorState1 INT;        SELECT @ErrorMessage1 = ERROR_MESSAGE();        SELECT @ErrorSeverity1 = ERROR_SEVERITY();        SELECT @ErrorState1 = ERROR_STATE();        RAISERROR (@ErrorMessage1, -- Message text.                   @ErrorSeverity1, -- Severity.                   @ErrorState1 -- State.                   );    END CATCH    RETURN @DomainIdENDGO 

Bạn cần thêm trợ giúp?

Bạn muốn xem các tùy chọn khác?

Khám phá các lợi ích của gói đăng ký, xem qua các khóa đào tạo, tìm hiểu cách bảo mật thiết bị của bạn và hơn thế nữa.