Vous êtes sur la page 1sur 5

Controle de Concorrncia

Muitos problemas ocorrem durante o controle de concorrncia. Para que voc consiga entender o funcionamento e resolver este problema, aconselhvel a leitura de todo este documento. O Controle de concorrncia no nada mais que controlar duas ou mais pessoas acessando a mesma informao ao mesmo tempo. Para efetuar este controle so utilizados comandos e funes especficas de cada banco de dados e cada qual tem um funcionamento prprio. Desta forma, o processo executado no servidor de banco de dados e um bloqueio real do registro. Uma vez bloqueado este registro no pode mais ser alterado ou visualizado por nenhum outro processo, seja GeneXus ou no. Este funcionamento prprio da base de dados e no existe como impedir. O que pode ser e feito pelo GeneXus a reduo do tempo de durao do mesmo. O bloqueio notado quando na rede quando outros computadores simplesmente param de responder, emitindo mensagens ou no, ficando esttico. Esta parada no uma parada proposital do GeneXus. Qualquer outra aplicao, GeneXus ou no e at mesmo uma simples consulta SQL ficar parada sem resposta. Isto se deve ao fato de que durante o processo de gravao, o controle de concorrncia bloqueia o registro. Este procedimento claro, pois se algum est alterando algo, melhor esperar a pessoa acabar de gravar para que as informaes recuperadas sejam as informaes finais ps-atualizao. Este o funcionamento do controle de concorrncia utilizado pelo Banco de Dados, mas o GeneXus utiliza de formas diferentes para controlar as concorrncias: Conversacional e Pseudo-Conversacional Tipo de Bloqueio: Conversacional Mensagem: Record in use by another - O registro esta sendo utilizado Quando uma transao, por exemplo, entra em modo de atualizao (Logo aps sair do Atributo Chave na transao), existe o bloqueio da informao para que ningum altere. Uma vez o registro bloqueado, ningum mais pode alterar estas informaes. Este o tipo de bloqueio Conversacional do GeneXus. Ao iniciar uma alterao, os dados so bloqueados e ningum mais pode acessar. Imagine ento um usurio que entra em uma transao e inicia uma alterao e vai almoar sem sair do modo de update. Todos os processos que dependem desta informao sero bloqueados, nenhuma mensagem ser exibida e tudo ficar parado esperando que o usurio saia do modo de update. Objetos do GeneXus: Todos, principalmente Transaes. Tempo de Vida do Bloqueio: Depois de sair do atributo chave em transao at a confirmao ou no dos dados. Mensagem de erro ao acessar duas transaes simultaneamente: Record in use by another O registro esta sendo utilizado

Tipo de Bloqueio: Pseudo-Conversacional Mensagem: <Tabela> was changed. - <Tabela> foi modificada. Para evitar o problema da concorrncia Conversacional, onde simplesmente pelo fato de entrar em modo Update o registro bloqueado, permanecendo neste estado at a confirmao ou cancelamento do modo parando assim toda a aplicao, foi criado o tipo de concorrncia pseudo-conversacional. Neste controle no existe o bloqueio aps a sada do(s) atributo(s) chave(s). O bloqueio feito somente aps a confirmao da gravao dos dados (antes da regra After(Confirm) ou On AfterValidate) e sua durao muito curta, ficando bloqueado o registro somente durante o tempo de gravao efetiva. Seguindo este raciocnio, fica claro que como o registro no est bloqueado, outra pessoa pode alterar as informaes do registro ao mesmo tempo, pois este no se encontra bloqueado. Para evitar que ocorra perda de dados, o GeneXus l os dados no momento em que voc entra em modo update na transao e compara estes com os dados que esto gravados na base de dados antes da gravao efetiva dos dados. Se estes estiverem alterados, uma mensagem ser exibida: <Tabela> was changed. - <Tabela> foi modificada. Objetos do GeneXus: Transaes. Tempo de Vida do Bloqueio: Somente durante a gravao dos dados. Mensagem de erro ao acessar duas transaes simultaneamente: <Tabela> was changed. <Tabela> foi modificada.

Perguntas Freqentes: P: O problema no est ocorrendo em transaes e sim em procedures. Tem alguma coisa a ver? R: Entenda que isso no vlido somente para Transaes, mas para qualquer outra operao. Um For Each, por exemplo, em uma procedure ou uma consulta em uma WorkPanel. Estes objetos ficaro sem poder acessar os dados e parados enquanto aquela transao no sair do modo de update. P: Minha procedure fica parada por vrios minutos, chegando a horas. R: Sim. O GeneXus gera cdigos de forma a no emitir erros caso se encontre um registro bloqueado. Um For Each pode ficar vrias horas aguardando que um registro seja desbloqueado. Entenda que o problema no est na procedure e sim no objeto que est segurando o bloqueio. Este deve ser resolvido. P: Coloquei meu controle de concorrncia como Pseudo-Conversacional e mesmo assim est sendo exibida a mensagem Record in use by another - O registro esta sendo utilizado e esta para concorrncia Conversacional e no Pseudo. R: Esta transao tem 2 nveis. Ao confirmar uma alterao no primeiro nvel, indo para o segundo nvel, o primeiro nvel bloqueado como se fosse concorrncia Conversacional, bloqueando o mesmo at a confirmao de toda a transao.

Caso nenhuma alterao seja feita no primeiro nvel, no feito nenhum bloqueio. Para resolver este problema, no permita a edio do primeiro nvel em uma transao de dois nveis. P: Coloquei o controle de concorrncia como para Pseudo-Conversacional e mesmo assim o sistema est sendo bloqueado. Estou utilizando SQL Server 2000. R: O SQL Server 2000 bloqueia os registros por pgina e isso um problema. Uma pgina uma coleo de registros e no um nico registro. Para resolver o problema, voc deve diminuir a compatibilidade para verso 7.0, tanto no SQL Server como no GeneXus, parar e reiniciar o SQL Server. Somente ir funcionar aps reiniciar o SQL Server. Em ambiente Web no necessrio diminuir a compatibilidade, pois dificilmente um processo conseguir bloquear por mais de 1 minuto um registro. O bloqueio em pginas muito mais rpido que o bloqueio de registros. Porm, com o GeneXus 8.0 no necessrio mais diminuir a compatibilidade do banco de dados. A ARTech alterou os cdigos gerados para que estes bloqueios por pgina no ocorram mais. Para alterar a compatibilidade no SQL Server: - Abra o Enterprise Manager - Abra Console Root / Microsoft SQL Servers / <Servidor SQL onde est o Banco> / Databases / <Banco de Dados> - Clique com o direito sobre o Banco de Dados - Aba Options / Compatibility Level - Coloque como 70. Nota: necessrio PARAR o servio do SQL Server ao menos, sem dar boot. P: Estou utilizando Access. Como devo proceder? R: O Access s faz bloqueios por pgina e no existe como alterar. P: Mesmo sem ningum acessando o sistema eu recebo a mensagem <Tabela> was changed. - <Tabela> foi modificada.. R: Provavelmente voc est rodando uma procedure dentro de uma regra ou evento sobre uma das tabelas da transao para atualizar os dados. Ao gravar os dados, o GeneXus nota que a procedure alterou os dados e emite a mensagem. Tente, em vez de gravar na base de dados, receber os dados via parmetro e deixar que a transao os grave. Neste caso a Procedure deve ter como Parm variveis InOut ou somente Out e o call na transao para a procedure ter atributos. Os valores retornados ficaro armazenados dentro dos atributos. P: Minha transao para de funcionar e fica aguardando algo acontecer e no sei o que . R: Provavelmente seu bloqueio Conversacional e voc est chamando uma procedure que grava ou l os dados da mesma. Como o registro est bloqueado, sua procedure fica aguardando a liberao. Voc precisa alterar o funcionamento para que sua procedure seja executada em outro momento. P: Qual a diferena entre uma transao e uma procedure no que diz respeito ao bloqueio? R: Comandos For Each no possuem concorrncias distintas. Eles so sempre Conversacionais. Um For Each em toda a tabela ser encarado como leitura e no haver bloqueio algum. Um For Each com pelo menos a gravao de 1 atributo, o For Each ir

bloquear os dados, pois entende que ir ser feita a gravao. Este bloqueio ser feito em todos os registros que forem iguais a Start From e Loop While na especificao, sendo desconsiderado os filtros Constrains. Se no existir Start From e Loop While, o bloqueio ser em toda a tabela durante todo o tempo de execuo do For Each. Para resolver este problema, separe e crie um For Each dentro de uma Sub somente para gravar os dados. P: As vezes o sistema todo para de funcionar, ficando travado. R: Entendendo todos os conceitos acima, voc vai ter de descobrir quem est bloqueando o seu sistema. Voc pode encontrar isso dentro do seu Servidor de Base de Dados, como SQL Server, Oracle, etc. Outra forma de descobrir gerando um Log com o Utilitrio GeneXus DB Activity Trace, que se encontra em Iniciar / Programas / GeneXus x.x/ GeneXus Utilities. Descobrindo quem est bloqueando o seu sistema, voc precisa alterar a forma de trabalho para resolver a mesma. P: Como funciona o controle de concorrncia em ambientes Web? R: Somente como Pseudo-Conversacional. Os dados so validados em transaes durante a gravao dos mesmos e no existe o problema de dois nveis em uma transao, porm, uma procedure muito demorada pode parar todo o sistema. Em ambiente Web, a vida dos objetos muito curta e os bloqueios tambm. Dificilmente os dados so bloqueados. P: Transaction (Process ID 999) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. R: O Deadlock um pouco complexo. Existem casos onde o bloqueio feito sobre duas tabelas ao mesmo tempo e nenhum dos dois casos podem ser resolvidos. Imagine a seguinte seqncia: Processo 1 - Bloquear Tabela A Processo 2 - Bloquear Tabela B Processo 1 - Bloquear Tabela B - Neste ponto o processo 1 fica aguardando o trmino do processo 2, pois o mesmo j est bloqueando a tabela. Processo 2 - Bloquear Tabela A - gerado um Deadlock, pois no tem mais como resolver os bloqueios e o sistema ficaria parado eternamente. O Deadlock gerado pelo SQL Server e NO pelo GeneXus. No existem maneiras de evitar este erro. Ele vai ocorrer sempre que houver casos de bloqueios cclicos. O que voc deve fazer entender e resolver todas as chamadas, de forma que no sejam mais bloqueados os dados. O processo que sofre o Deadlock eleito pelo SQL Server com base nas informaes alteradas no banco de dados. Aquele que tiver gravado menos informaes no banco de dados ser o eleito. Existem casos bem mais complexos que o exemplificado e que podem envolver uma quantidade grande de processos e alguns ou todos sofrero Deadlock ao mesmo tempo.

Este documento no tem por objetivo resolver seu problema e sim ajudar voc a entender. A soluo sua, pois cada problema tem uma soluo especfica e que se adequar as suas necessidades de negcio.