Entendendo o uso do SOQL Locking Records

No post de hoje vamos falar sobre o SOQL Locking Records, imagine o cenário onde você precisa fazer o processamento em vários registros, e nesse pequeno intervalo de tempo, ninguém poderá modificar esse registro, para conseguirmos esse feito, precisamos usar o Locking Records, então vamos lá entender como isso funciona?

 

O que é Locking Records

O Locking Records é uma forma de bloquear os registros do Salesforce em uma transação Apex, basicamente o Locking Records consiste na inclusão de duas palavras chaves em sua SOQL, dessa forma todos os registros resultantes da sua SOQL serão bloqueados e não poderão ser alterados até que a transação do Apex seja concluída.

ao utilizar o FOR UPDATE você não poderá especificar um ORDER BY

Dois pontos importantes aqui são, o primeiro é que não é necessário realizar o commit dos dados, se ocorrer um erro na transação Apex, todas as alterações serão desfeitas, e caso a transação termine sem erros, os registros serão comitados automaticamente.

Outro ponto de atenção é que ao utilizar o FOR UPDATE você não poderá especificar um ORDER BY, talvez esse seja o ponto chave que dificulte a sua utilização, porém como a idea do Locking Records é garantir que os registros envolvidos sejam bloqueados, a ordenação por si só tomará tempo de processamento, e uma vez que você faz o bloqueio dos registros, o ideal é liberá-los o mais rápido possível.

Em uma consulta SOQL temos que utilizar as palavras chaves reservadas FOR UPDATE isso garante que os registros serão bloqueados até o final da transação Apex, no exemplo abaixo os registros estão sendo utilizados dentro de um Loop For.

for (Account[] accts : [SELECT Id FROM Account WHERE CreatedDate = THIS_MONTH
                        FOR UPDATE]) {
    // Seu código aqui!
}

Se você tentar fazer o Locking Records em um registro que já esta bloqueado por outra transação Apex, você receberá uma QueryException, e caso você tente realizar o update  de um registro que esta bloqueado por outra transação do Apex você receberá uma DmlException.

 

Evitando Deadlocks

tenha certeza de estar realizando o Locking Records somente nos registros que realmente serão alterados

O Apex tem a possibilidade de deadlocks, assim como qualquer outra linguagem de lógica procedural envolvendo atualizações em várias tabelas ou linhas de banco de dados ao mesmo tempo. Para evitar se deparar com os deadlocks, o mecanismo de tempo de execução do Apex realiza:

  1. Primeiro bloqueia registros pai sObject e, em seguida, filhos.
  2. Bloqueia sObject em ordem pelo ID quando vários registros do mesmo tipo estão sendo editados.

Como desenvolvedor, tenha cuidado ao bloquear muitas registros no Salesforce, para garantir que você não esteja provocando um deadlocks, tente ao máximo evitar que seu processo seja demorado, e tenha certeza de estar realizando o Locking Records somente nos registros que realmente serão alterados.

 

Conclusão

O Locking Records é uma ferramenta poderosa e deve ser utilizado em cenários bem específicos, em suma o Salesforce trabalha muito bem com múltiplas concorrências, mas existem casos e casos, acredito que o mais importante de saber o que é o Locking Records, é principalmente quando usar, não saia fazendo o uso dele em todas as suas consultas SOQL, também recomendo que faça o uso dele em conjunto com o método futuro, isso garantirá ainda mais segurança de acesso ao dados, pois você terá certeza de que o sistema não esta passando por um período de pico, uma vez que os métodos futuros são assíncronos e Salesforce vai garantir  que eles serão executados na melhor hora possível.

Aproveitando que você chegou até aqui, me conte aqui em baixo nos comentários, quais temas ou assuntos você gostaria de ler aqui no blog?

 

Um forte abraço trailblazer e até o próximo post :)

 

 

Fernando Sousa

Senior Salesforce Developer

Bacharel em Sistemas da Informação pela Universidade de Taubaté (UNITAU) e MBA em Projeto de Aplicações para Dispositivos Móveis pelo IGTI – Instituto de Gestão em Tecnologia da Informação. 

Comecei a programar bem cedo, por volta de 10 anos de idade, de maneira auto-didata passei por várias linguagens.

Em 2015 me conectei a plataforma Salesforce pela primeira vez, para fazer una integração entre um Aplicativos Mobile em android e o Salesforce Platform. 

Atualmente com as certificações Salesforce Certified Platform Developer I, Salesforce Certified Platform App BuilderSalesforce Certified Platform Developer IISalesforce Administrator e Sharing and Visibility.

Acompanhe meu Trailhead aqui.

 

ApexLockingSalesforceSalesforceDeveloperSalesforceDevelopmentSOQL