"A contagem de bloqueios de partilha de ficheiros foi excedida..." durante o processamento de transações grandes

Sintomas

Quando um ou mais utilizadores processam muitas transações num ambiente multiutilizador, as transações podem falhar com a seguinte mensagem de erro:

A contagem de bloqueios de partilha de ficheiros foi excedida. Aumente a entrada de registo MaxLocksPerFile.

Causa

O erro ocorre se o número de bloqueios necessários para efetuar uma transação exceder o número máximo de bloqueios por ficheiro.

Solução

Importante: esta secção, método ou tarefa contém passos que explicam como modificar o registo. No entanto, poderão ocorrer problemas graves se modificar o registo de forma incorreta. Por conseguinte, certifique-se de que segue estes passos cuidadosamente. Para maior segurança, faça uma cópia de segurança do registo antes de o modificar. Deste modo, pode restaurar o registo se ocorrer um problema. Para mais informações sobre como fazer uma cópia de segurança e restaurar o registo, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:

322756 Como fazer uma cópia de segurança e restaurar o registo no Windows

Para contornar este problema, aumente o número máximo de bloqueios por ficheiro. Para tal, utilize um dos seguintes métodos:

Método 1: Defina a chave de registo como MaxLocksPerFile para aumentar o número máximo de bloqueios por ficheiro

  1. Clique em Iniciar e, em seguida, clique em Executar.

  2. Escreva regedite, em seguida, clique em OK.

  3. Localize a seguinte chave de registo consoante a instalação do Access:

    Instalação do Windows Installer (MSI)

    • Para a versão de 32 bits do Access em execução na versão de 32 bits do Windows ou versão de 64 bits do Access em execução na versão de 64 bits do Windows

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\<x.0>\Access Connectivity Engine\Engines\ACE

    • Para a versão de 32 bits do Access em execução na versão de 64 bits do Windows

      HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\<x.0>\Access Connectivity Engine\Engines\ACE

    Instalação Clique-e-Use

    • Para a versão de 32 bits do Access em execução na versão de 32 bits do Windows ou versão de 64 bits do Access em execução na versão de 64 bits do Windows

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\<x.0>\Access Connectivity Engine\Engines\ACE

    • Para a versão de 32 bits do Access em execução na versão de 64 bits do Windows

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Wow6432Node\Microsoft\Office\<x.0>\Access Connectivity Engine\Engines\ACE

    Nota

    O <marcador de posição x.0> representa a sua versão do Office (16.0 = Office 2016, Office 2019, Office LTSC 2021 ou Microsoft 365, 15.0 = Office 2013).

  4. No painel direito do registo Revisor, faça duplo clique em MaxLocksPerFile.

  5. Na caixa de diálogo Editar Valor DWORD , selecione Decimal.

  6. Modifique o valor da caixa Dados do valor conforme necessário e, em seguida, selecione OK.

Tenha em atenção que este método altera a definição de registo para todas as aplicações que utilizam a versão 4.0 do motor de base de dados do Microsoft Jet.

Método 2: Utilizar o método SetOption para alterar temporariamente MaxLocksPerFile

Nota

O código de exemplo neste artigo utiliza Objetos do Microsoft Data Access. Para que este código seja executado corretamente, tem de referenciar a Biblioteca de Objetos do Microsoft DAO 3.6. Para tal, clique em Referências no menu Ferramentas no visual basic Revisor e certifique-se de que a caixa de verificação Biblioteca de Objetos do Microsoft DAO 3.6 está selecionada.

O método SetOption substitui temporariamente o número predefinido de bloqueios por ficheiro. Define o número predefinido de bloqueios por ficheiro quando define a chave de registo MaxLocksPerFile. Pode definir o novo valor com o método SetOption. O novo valor é válido até fechar o objeto DBEngine. Para utilizar o Método 2, siga estes passos:

  1. Abra o Microsoft Access.

  2. Abra uma base de dados e, em seguida, prima Alt+F11 para iniciar o editor do Visual Basic.

  3. Na janela Microsoft Visual Basic -<Database Name>-[<Nome> do Módulo (Código)] , selecione Janela Imediata no menu Ver .

  4. Em Janela Imediata, introduza o seguinte código:

    DAO.DBEngine.SetOption dbmaxlocksperfile,15000

  5. Prima a tecla ENTER para executar a linha de código. Este comando define temporariamente o valor MaxLocksPerFile para 15 000.

Para processar transações grandes, defina o valor MaxLocksPerFile para cumprir os seus requisitos e, em seguida, execute as transações na sessão.

As alterações efetuadas à definição MaxLocksPerFile através do método SetOption só estão disponíveis para a sessão atual.

Mais informações

A definição MaxLocksPerFile determina o número máximo de bloqueios que o Microsoft Jet coloca num ficheiro. O valor maxLocksPerFile predefinido é 9500. No entanto, não altere este valor se estiver a trabalhar num servidor Novell NetWare, porque o máximo de bloqueios de registo do servidor por ligação é de 10 000.