Erro ao usar o modo automático do gerenciador de bloqueio. Controle e mecanismo de bloqueio de dados de transação

Os principais motivos para mudar para bloqueios gerenciados:

  • O principal motivo é a recomendação do 1C:Expert com base no depoimento ou 1C:TsUP
  • Problemas com usuários simultâneos ()
  • Usando Oracle, PostgreSQL e .

Custo do trabalho:

A essência dos bloqueios gerenciados

Ao trabalhar no modo de controle de bloqueio automático, 1C:Enterprise define um alto grau de isolamento de dados em uma transação no nível do SGBD. Isso permite eliminar completamente a possibilidade de obtenção de dados incompletos ou incorretos sem nenhum esforço especial por parte dos desenvolvedores de aplicativos.

Esta é uma abordagem conveniente e correta para um pequeno número de usuários ativos. O preço da facilidade de desenvolvimento é uma certa quantidade de bloqueio redundante no nível do SGBD. Esses bloqueios estão associados tanto às peculiaridades da implementação de mecanismos de bloqueio no próprio SGBD, quanto ao fato de que o SGBD não pode (e não leva) levar em consideração o significado físico e a estrutura dos objetos de metadados 1C:Enterprise.

Ao trabalhar com alta contenção de recursos (grande número de usuários), em algum momento o impacto dos bloqueios redundantes torna-se perceptível em termos de desempenho em modo paralelo.

Após a transferência da configuração para o modo gerenciado, a funcionalidade adicional do “gerenciador de bloqueio” é ativada na plataforma e o controle da integridade dos dados passa a ser realizado não no lado do SGBD, mas no lado do servidor 1C. Isso aumenta a carga no hardware do servidor 1C (são necessários processadores mais rápidos e mais memória) e, na verdade, introduz até uma ligeira desaceleração (vários por cento), mas melhora significativamente a situação com bloqueios (menos bloqueios devido a bloqueios em um objeto, e não em uma combinação de tabelas, menos área de bloqueio e, em alguns casos, a vida útil dos bloqueios de leitura é mais curta, ou seja, não até o final da transação). Isso melhora a simultaneidade geral.


Novas configurações de 1C foram implementadas imediatamente em modo controlado.

  • Pergunta: É possível fazer primeiro uma auditoria e depois transferir para FM?

Resposta: Sim, a auditoria servirá como justificação adicional para a viabilidade da mudança para bloqueios geridos e também para avaliar a contribuição dos bloqueios automáticos para o abrandamento global e se são necessários esforços adicionais para além da transferência.

  • Pergunta: Para transferir para UX, que tipo de acesso deve ser fornecido - RDP, TeamViewer? Ou posso te enviar o arquivo de configuração?

Resposta: Tentamos não nos limitar a uma tecnologia específica de acesso remoto, isso servirá qualquer tecnologia de acesso remoto. Se isso não importa para você, o RDP é mais prático.
Podemos realizar a otimização com base no arquivo de configuração enviado, mas então não poderemos depurar alguns dados reais e você terá que testar com mais cuidado. Se realizarmos a otimização em uma cópia do banco de dados, poderemos testá-la mais detalhadamente antes de fornecermos o resultado do trabalho.

  • Pergunta: Temos 10 programadores em tempo integral que mudam alguma coisa na conferência todos os dias. Um armazenamento de configuração compartilhado é usado." Como será organizada a interação durante a transferência para UX? Ou todos os programadores deveriam sair de férias?

Resposta: Via de regra, nossas alterações são feitas em alguns dias. O resto do tempo é gasto testando as alterações feitas, inclusive do ponto de vista da lógica necessária determinada pelo negócio e não por considerações técnicas. Nós podemos fazer alterações em um arquivo de configuração separado cf e então seu programador irá enviá-lo para o repositório. Ninguém terá que sair de férias. Nas demais opções de interação, basta combinar quais objetos seus desenvolvedores pretendem capturar, para que possamos construir um plano de trabalho que seja conveniente para ambas as partes. Via de regra, seus desenvolvedores não precisam capturar toda a configuração ou nos dar o “volante” do dia.

O sistema 1C:Enterprise permite usar dois modos de trabalho com o banco de dados: o modo de bloqueios automáticos em uma transação e o modo de bloqueios controlados em uma transação.

A diferença fundamental entre esses modos é a seguinte. O modo de bloqueio automático não exige que o desenvolvedor execute nenhuma ação para gerenciar os bloqueios em uma transação. Essas regras são garantidas pela plataforma do sistema 1C:Enterprise através do uso de certos níveis de isolamento de transações em um determinado SGBD. Este modo de operação é o mais simples para o desenvolvedor, porém, em alguns casos (por exemplo, com intenso trabalho simultâneo de um grande número de usuários), o nível de isolamento da transação utilizado no SGBD não consegue fornecer paralelismo suficiente, o que se manifesta no forma de um grande número de conflitos de bloqueio quando os usuários trabalham.

Ao operar no modo de bloqueio gerenciado, o sistema 1C:Enterprise utiliza um nível muito mais baixo de isolamento de transações no SGBD, o que pode aumentar significativamente a simultaneidade de usuários da solução de aplicação. No entanto, ao contrário do modo de bloqueio automático, este nível de isolamento de transação já não pode, por si só, garantir a conformidade com todas as regras para trabalhar com dados numa transação. Portanto, ao trabalhar no modo gerenciado, o desenvolvedor é obrigado a gerenciar de forma independente os bloqueios definidos na transação.

Em resumo, as diferenças ao trabalhar no modo de bloqueio automático e no modo de bloqueio controlado são mostradas na tabela a seguir:

Definir o modo de bloqueio na configuração

A configuração possui a propriedade Data Lock Control Mode. Cada objeto de aplicativo de configuração também possui uma propriedade Modo de controle de bloqueio de dados.
O modo de controle de bloqueio de dados para toda a configuração pode ser definido como Automático, Gerenciado (o padrão para uma nova configuração) ou Automático e Gerenciado. Os valores Automático e Gerenciado significam que o modo de bloqueio correspondente será utilizado para todos os objetos de configuração, independentemente dos valores definidos para cada um dos objetos. O valor Automático e Gerenciado significa que para um determinado objeto de configuração será utilizado o modo especificado em sua propriedade Modo de Controle de Bloqueio de Dados: Automático ou Gerenciado.
Deve-se observar que o modo de controle de bloqueio de dados especificado para um objeto de metadados é definido para as transações que são iniciadas pelo sistema 1C:Enterprise ao trabalhar com os dados deste objeto (por exemplo, ao modificar os dados do objeto).
Se, por exemplo, a operação de escrita de um objeto for realizada em uma transação iniciada pelo desenvolvedor (o método StartTransaction()), então o modo de controle de bloqueio de dados será determinado pelo valor do parâmetro Locking Mode
método StartTransaction() e não o valor da propriedade do objeto de metadados Data Lock Control Mode.
Por padrão, o parâmetro Modo de Bloqueio é definido como Modo de Controle de Bloqueio de Dados Automático, portanto, para.
Para usar o modo de bloqueio gerenciado em uma transação explícita, você deve especificar o valor deste parâmetro
Modo de controle de bloqueio de dados gerenciado.

Trabalhando com bloqueios gerenciados usando a linguagem integrada

Para gerenciar bloqueios em uma transação, o objeto de linguagem integrado DataLock é usado. Uma instância deste objeto pode ser criada usando um construtor e permite descrever os espaços de bloqueio e modos de bloqueio necessários. Para definir todos os bloqueios criados, use o método Lock() do objeto DataLock. Se este método for executado em uma transação (explícita ou implícita), os bloqueios são adquiridos e serão liberados automaticamente quando a transação terminar. Se o método Lock() for executado fora de uma transação, nenhum bloqueio será adquirido.

As condições são definidas para que o valor do campo seja igual ao valor especificado ou para que o valor do campo esteja dentro do intervalo especificado.
As condições podem ser definidas de duas maneiras:

  • especificando explicitamente o nome e o valor do campo (método SetValue() do objeto DataLockElement);
  • especificando uma fonte de dados contendo os valores necessários (propriedade DataSource do objeto DataLockElement).

Para cada elemento de bloqueio, um dos dois modos de bloqueio pode ser definido:

  • compartilhado,
  • excepcional.

A tabela de compatibilidade de bloqueio gerenciado é semelhante a esta:

O modo de bloqueio compartilhado significa que os dados bloqueados não podem ser modificados por outra transação até o final da transação atual.
Bloqueio exclusivo significa que os dados bloqueados não podem ser modificados por outra transação até o final da transação atual, nem podem ser lidos por outra transação que mantenha um bloqueio compartilhado nos dados.

Características de operação no modo “Automático e controlado”

Ao trabalhar no modo de controle de bloqueio Automático e Controlado, duas características devem ser levadas em consideração:

Independentemente do modo especificado para uma determinada transação, o sistema instalará o software gerenciado apropriado
bloqueio.
O modo de controle de bloqueio é determinado pela transação de nível mais alto. Em outras palavras, se outra transação foi iniciada no momento em que a transação foi iniciada, então a transação iniciada só poderá ser executada no modo definido para a transação já em execução.

Vamos considerar os recursos listados com mais detalhes.

A primeira característica é que mesmo que o modo de gerenciamento automático de bloqueio seja usado para uma transação, o sistema instalará adicionalmente os bloqueios gerenciados correspondentes ao gravar dados nesta transação. Segue-se que as transações executadas no modo de bloqueio gerenciado podem entrar em conflito com as transações executadas no modo de gerenciamento de bloqueio automático.

A segunda característica é que o modo de gerenciamento de bloqueio especificado para um objeto de metadados na configuração ou especificado explicitamente ao iniciar uma transação (como parâmetro para o método StartTransaction()) é apenas um modo “desejado”. O modo real de gerenciamento de bloqueio no qual a transação será executada depende se esta é a primeira chamada para iniciar uma transação ou se outra transação já foi iniciada nesta sessão do sistema 1C:Enterprise naquele momento.

Por exemplo, se você precisar gerenciar bloqueios ao gravar conjuntos de registros de registros ao lançar um documento, o modo de bloqueio gerenciado deverá ser definido tanto para o próprio registro quanto para o documento, uma vez que a gravação de conjuntos de registros de registros será realizada na transação aberto ao escrever o documento.

Mecanismo de gerenciamento de bloqueio de dados em uma transação permite bloquear dados alteráveis ​​não por meio do sistema de gerenciamento de banco de dados utilizado, mas por meio da plataforma. Esse gerenciamento de bloqueio de dados não é realizado em termos de dados do SGBD, mas em termos da área temática. Graças a isso, os bloqueios são aplicados com mais precisão e a simultaneidade do usuário aumenta.

A configuração 1C:Enterprise 8 pode operar em um dos três modos de gerenciamento de bloqueios em uma transação:

  • auto;
  • gerenciado – modo padrão para novas configurações;
  • automático e controlado.

EM modo automático O gerenciamento de bloqueio de dados usa os níveis de isolamento de transação serializável e de leitura repetível fornecidos pelo sistema de gerenciamento de banco de dados. Esses níveis de isolamento de transação garantem uma leitura consistente e consistente dos dados sem exigir nenhum esforço adicional de gerenciamento de bloqueio por parte do desenvolvedor.

Modo gerenciado permite aumentar o paralelismo do trabalho do usuário no modo de operação cliente-servidor usando um nível mais baixo de isolamento de transação de banco de dados (leitura confirmada). Ao gravar dados em uma transação, os objetos de linguagem integrados bloqueiam automaticamente os dados necessários. O desenvolvedor precisa gerenciar bloqueios de dados nos casos em que a lógica de negócios exige uma leitura consistente e consistente dos dados em uma transação.

Automático e controlado O modo permite que você use a capacidade de gerenciar bloqueios em uma transação apenas para alguns objetos de configuração. Este modo pode ser usado para otimizar a simultaneidade do usuário com objetos de aplicativos individuais (por exemplo, alguns dos documentos mais usados) ou para fazer a transição gradual de grandes configurações para o modo de gerenciamento de bloqueio de transação.

Em resumo, as diferenças ao trabalhar no modo de bloqueio automático e no modo de bloqueio controlado são mostradas na tabela a seguir:

Na maioria das vezes, a necessidade de gerenciar bloqueios de dados em uma transação surge no processo de lançamento de documentos, quando você precisa ler e depois gravar os dados alterados nas mesmas tabelas. Por exemplo, se você estiver monitorando saldos ao lançar um documento.

Especialmente para este fim, os conjuntos de registos de acumulação e de registos contabilísticos têm a propriedade BlockForChange.

Caso seja necessário controlar os saldos e posteriormente registrar as movimentações no mesmo cadastro, então esta propriedade deverá ser configurada para o conjunto de registros deste cadastro no imóvel Movimentos.

O efeito desta propriedade é o mesmo que se o desenvolvedor instalasse independentemente (prescrito no código) os bloqueios gerenciados necessários para 1C:Enterprise 8. A plataforma instalará o bloqueio gerenciado necessário automaticamente ao gravar este conjunto de registros. Como resultado, outras transações gerenciadas que utilizam o mesmo bloqueio não poderão iniciar a leitura deste registro até que a transação atual seja concluída.

Abaixo está um exemplo de controle "manual" de bloqueios de dados ao ler dados do registro de acumulação Contabilização de itens no processamento de documentos Fatura de vendas. Neste exemplo, os bloqueios gerenciados são criados e definidos inteiramente usando a linguagem integrada.

Mecanismo bloqueios de transação usado para acesso competitivo de usuários ao SGBD.
Uma transação é um tipo de operação contínua durante a qual o estado do banco de dados muda. Este é o quantum mínimo de mudança: você não pode fazer meia transação; se a transação não for concluída, o banco de dados retornará ao seu estado inicial.
Como uma transação captura um array de dados, surge uma nuance no acesso a esse array: por exemplo, uma transação altera os dados e outra tenta lê-los. O resultado da leitura pode estar incorreto, porque não incluirá as alterações mais recentes. Portanto, o isolamento de transações funciona no nível do SGBD. Os seguintes níveis de isolamento são possíveis:

  • Leia sem compromisso- enquanto uma transação altera o array, outra não pode alterá-lo, mas pode lê-lo. Nível mais baixo de isolamento.
  • Leitura confirmada- enquanto uma transação altera o array, outra não pode alterá-lo ou lê-lo
  • Leitura repetível- enquanto uma transação lê o array, outra não pode alterá-lo, mas pode lê-lo
  • Serializável- enquanto uma transação lê o array, outra não pode alterá-lo ou lê-lo. Todas as operações são sequenciais. Nível máximo de isolamento.

Se a configuração 1C:Enterprise estiver definida como modo de bloqueio automático, então o nível de isolamento da transação é selecionado pelo DBMS. No caso do MS SQL, serão níveis de leitura repetível ou serializáveis, ou seja, o isolamento dos dados está próximo do máximo. Isso resolve problemas de correção de dados, mas pode levar ao bloqueio no nível do SGBD durante o trabalho intensivo do usuário. Portanto, 1C:Enterprise possui funcionalidade própria para trabalhar com bloqueios, que é ativada habilitando o modo de bloqueios gerenciados. Nesse caso, o nível de isolamento da transação para MS SQL será confirmado para leitura. A própria plataforma isolará os dados sem depender do SGBD.

O modo de bloqueio gerenciado está habilitado nas propriedades de configuração:

Além disso, o modo de bloqueio pode ser definido para objetos de configuração específicos:

Se a configuração como um todo estiver definida para o modo de bloqueio automático, todas as transações de todos os registros funcionarão em modo automático, independentemente do modo definido para o objeto de configuração. Se for Gerenciado, da mesma forma, todas as transações estarão em Gerenciado. Se o modo de configuração estiver definido como Automático e controlado, o modo de cada objeto será determinado pelas suas configurações.

Existe um ponto para o modo Automático e controlado. Uma única transação para um usuário pode representar diversas transações do ponto de vista da plataforma. Por exemplo, postar interativamente um documento em um registro faz com que dois transações - um registro do próprio documento e, dentro desta transação, um registro de um conjunto de linhas por registro. Dependendo do modo de gerenciamento de bloqueio do próprio documento e do registro que ele movimenta, quatro situações são possíveis:

  1. Modo documento Automático, modo de registro Automático ->
  2. Modo documento Gerenciado, modo registro Gerenciado -> registro por registro em modo gerenciado
  3. Modo documento Automático, modo registro Controlado -> registro por registro em modo automático
  4. Modo documento Gerenciado, modo registro Automático -> exceção (erro)

Questão 06.59 do exame 1C: Platform Professional. Ao lançar um documento através de qualquer registro, se o documento tiver um modo de gerenciamento automático de bloqueio de transação e o registro tiver um modo gerenciado (a opção “Automático e gerenciado” é usada nas propriedades de configuração), então tal lançamento levará a:

A resposta correta é a segunda, a gente determina pela primeira transação, se for automática então tudo é automático.

Questão 06.60 do exame 1C: Platform Professional. Ao lançar um documento através de qualquer cadastro, se o documento possuir modo gerenciado para gerenciamento de bloqueios de transações, e o cadastro possuir modo automático (nas propriedades de configuração é utilizada a opção “Automático e gerenciado”), então tal lançamento levará a:

  1. para uma situação de erro
  2. toda a transação será concluída automaticamente
  3. toda a transação será concluída de forma controlada

A resposta correta é a primeira, determinamos pela primeira transação, se for controlada então é um erro.

Questão 06.61 do exame 1C: Platform Professional. Ao lançar um documento através de qualquer registro, se o documento possuir modo automático para gerenciamento de bloqueios de transações, e o registro possuir modo gerenciado (a opção “Gerenciado” é usada nas propriedades de configuração), então tal lançamento levará a:

  1. para uma situação de erro
  2. toda a transação será concluída automaticamente
  3. toda a transação será concluída de forma controlada


 

Pode ser útil ler: