PC SOFT
ONLINE REPOSITORY
FOR WINDEVWEBDEV AND WINDEV MOBILE

Home |  | Sign in | English US
Exemplo de Bloqueio de Registro em Rede - Example of Network Registration Blocking - Exemple de blocage d'enregistrement réseau
Published by Boller
in the category Tools
New features



Description
Exemplo de Bloqueio de Registro em Rede

VIDEO NO YOUTUBE

https://youtu.be/vjWGRUUdneE?si=wMRMmufRQY_qAuiC

Bloquear um registro de uma tabela em uma rede é uma prática importante por várias razões, especialmente em ambientes onde múltiplos usuários ou sistemas podem tentar acessar ou modificar os mesmos dados simultaneamente. Aqui estão algumas razões principais para o bloqueio de registros:

1. *Integridade dos Dados*: O bloqueio é crucial para manter a integridade dos dados. Se dois ou mais usuários tentarem modificar o mesmo registro ao mesmo tempo, sem um mecanismo de bloqueio adequado, as alterações de um usuário podem sobrescrever as do outro, levando a dados inconsistentes ou corrompidos.

2. *Controle de Concorrência*: Em sistemas de banco de dados, o controle de concorrência é essencial para garantir que as transações sejam executadas de maneira segura e eficiente, mesmo quando várias operações ocorrem simultaneamente. O bloqueio de registros ajuda a gerenciar a concorrência, garantindo que apenas uma transação possa modificar um registro por vez.

3. *Isolamento de Transações*: O bloqueio ajuda a atingir níveis adequados de isolamento de transações, um dos princípios fundamentais dos sistemas de gerenciamento de banco de dados. Isso significa que as transações são isoladas umas das outras, garantindo que as operações em andamento não sejam afetadas por outras transações simultâneas.

4. *Prevenção de Deadlocks*: Embora o bloqueio possa, por vezes, levar a deadlocks (situações onde duas ou mais transações estão bloqueadas, esperando uma pela outra para liberar recursos), sistemas de banco de dados implementam mecanismos de detecção e resolução de deadlocks. O uso correto do bloqueio ajuda a minimizar a ocorrência desses deadlocks.

5. *Consistência de Leituras*: Em alguns casos, é importante garantir que os dados lidos durante uma transação permaneçam consistentes durante toda a transação. O bloqueio de registros pode ser utilizado para garantir que os registros lidos não sejam modificados por outras transações até que a transação atual seja concluída.

6. *Desempenho*: Embora o bloqueio possa parecer que diminuiria o desempenho, ao evitar acessos e modificações simultâneas não controladas, ele pode, na verdade, melhorar o desempenho geral do sistema. Isso ocorre porque ele reduz a necessidade de reverter transações devido a conflitos de dados.

Portanto, o bloqueio de registros é uma prática essencial em ambientes de rede para garantir a integridade, consistência e confiabilidade dos dados, além de otimizar o desempenho do sistema e garantir uma gestão eficaz da concorrência.

//CODIGO COMPLETO
DENTRO DE DOCUMENTAÇÃO FULL.PDF E DOCUMENTACAO CODE.PDF

AQUI TAMBEM:

// Summary: <specify the procedure action>
// Syntax:
// evento_alterar ()
//
// Parameters:
// None
// Return value:
// None
//
// Example:
// <Specify a usage example>
//
PROCEDURE evento_alterar()

GR_CAMPOS = ""

LIVRE is string = HInfoLock(t001_pessoas,gnid)

IF gnid > 0 AND LIVRE = ""

gsacao = "Alterar"

HReset(t001_pessoas)
IF HReadSeek(t001_pessoas,t001_pessoa_id,gnid,hIdentical) = True THEN

FileToScreen()

//AQUI BLOQUEIA O REGISTRO
evento_lock_registro()

MyWindow..Plane = 2

END

ELSE

HReset(sec023_lock_record)

IF HReadSeek(sec023_lock_record,sec023_id_loc, gnid,hIdentical) = True

Info("Esse registro esta bloqueado: ", LIVRE,
"USUARIO: " + sec023_lock_record.sec023_user_lock,
"Data Hora: "+ sec023_lock_record.sec023_datahora_lock)

//Guardo quem esta precisando do registro
gnidlock = gnid
sec023_lock_record.sec023_user_2 = "2"
HAdd(sec023_lock_record)

END

MyWindow..Plane = 1

END


//-------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
// evento_excluir ()
//
// Parameters:
// None
// Return value:
// None
//
// Example:
// <Specify a usage example>
//
PROCEDURE evento_excluir()

LIVRE is string = HInfoLock(t001_pessoas,gnid)

IF gnid > 0 AND LIVRE = ""

HReset(t001_pessoas)

IF HReadSeek(t001_pessoas,t001_pessoa_id,gnid,hIdentical) = True THEN

//1 : Sim
//2 : Não
SWITCH Dialog("Deseja Excluir?")
// Sim
CASE 1
IF HCross(t001_pessoas) = True THEN
Info("Excluiu com sucesso")
END
// Não
CASE 2

END

END

ELSE IF LIVRE <> ""

Info("Registro esta em uso por outra estação: "+ LIVRE)

END

//--------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
// evento_gravar ()
//
// Parameters:
// None
// Return value:
// None
//
// Example:
// <Specify a usage example>
//
PROCEDURE evento_gravar()

ScreenToFile() // SET GET GET SET

IF gsacao = "Incluir" THEN

//AQUI NAO TEM DESBLOQUEIO DE REGISTRO, NEM PRECISA

IF HAdd(t001_pessoas) = True THEN

Info("gravou com sucesso")

ELSE

Info(HErrorInfo(), ErrorInfo())

RETURN

END


ELSE IF gsacao = "Alterar"

//AQUI TEM DESBLOQUEIO DE REGISTRO PARA OUTRO USAR POIS VOLTA PARA A CAMADA 1

IF HModify(t001_pessoas) = True THEN

IF evento_unlock_registro() = True //OCORRE O DESBLOQUEIO

Info("gravou com sucesso")

ELSE

Info("Algo aconteceu na hora de desbloquear o registro")

END

ELSE

Info(HErrorInfo(), ErrorInfo())

RETURN

END

ELSE

Info(HErrorInfo(), ErrorInfo())

RETURN

END

TableDisplay(TABLE_T001_pessoas,taInit)

MyWindow..Plane = 1

//-------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
// evento_incluir ()
//
// Parameters:
// None
// Return value:
// None
//
// Example:
// <Specify a usage example>
//
PROCEDURE evento_incluir()

GR_CAMPOS = ""

gsacao = "Incluir"

HReset(t001_pessoas)

MyWindow..Plane = 2

//-------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
//[ <Result> = ] evento_lock_registro ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//
// Return value:
PROCEDURE evento_lock_registro()

IF HLockRecNum(t001_pessoas,hRecNumCurrent,hLockReadWrite) = False THEN

Info("Não foi possivel travar o registro, algo inesperado aconteceu: ", HErrorInfo(), ErrorInfo())

RESULT False

ELSE

HReset(sec023_lock_record)

sec023_lock_record.sec023_datahora_lock = DateSys()+TimeSys()
sec023_lock_record.sec023_user_lock = 1
sec023_lock_record.sec023_table_lock = t001_pessoas..Name
sec023_lock_record.sec023_id_loc = t001_pessoas.t001_pessoa_id
sec023_lock_record.sec023_uuid_loc = ""
sec023_lock_record.sec023_status = True
sec023_lock_record.sec023_motivo_urgencia = ""

HAdd(sec023_lock_record)

RESULT True

END

//-------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
// evento_selecionar ()
//
// Parameters:
// None
// Return value:
// None
//
// Example:
// <Specify a usage example>
//
PROCEDURE evento_selecionar()

nx is int = TableInfoXY(TABLE_T001_pessoas,tiLineNumber,MouseXPos(), MouseYPos())

IF nx > 0 THEN

gnid = TABLE_T001_pessoas[nx].COL_T001_pessoa_id

END

//-------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
//[ <Result> = ] evento_unlock_registro ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//
// Return value:
PROCEDURE evento_unlock_registro()

IF HUnlockRecNum(t001_pessoas,hRecNumCurrent) = False

Info("Não foi possivel destravar o registro, algo inesperado aconteceu: ", HErrorInfo(), ErrorInfo())

RESULT False

ELSE

//atualizando o sec lock que nao estou mais usando o registro
HReset(sec023_lock_record)
IF HReadSeek(sec023_lock_record,sec023_id_loc,gnid,hIdentical) = True THEN
sec023_lock_record.sec023_status = False
HModify(sec023_lock_record)
END

RESULT True

END

//-------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
// evento_view ()
//
// Parameters:
// None
// Return value:
// None
//
// Example:
// <Specify a usage example>
//
PROCEDURE evento_view()

nx is int = TableInfoXY(TABLE_T001_pessoas_selecionar,tiLineNumber,MouseXPos(), MouseYPos())

IF nx > 0 THEN

gnid = TABLE_T001_pessoas_selecionar[nx].COL_T001_pessoa_id

END

//---------------------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
//Thread_close_5min ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//
// Return value:// Automatic procedure:
// The procedure is automatically run, after the window initialization code, with a delay set to 1 second
// It will be run in a thread (without having to call ThreadExecute), without using HFSQL
// It will be repeated in a loop, with a timeout set to 1 second between each call
//

PROCEDURE Thread_close_5min()

gnTempoAberta += 1

IF gnTempoAberta >= 300 THEN

evento_unlock_registro()

InfoWithTimeout ( 10s, "Essa tela sera fechada em 10s por abandono..." )

END

//-------------------------------------------------------------------------------------------

// Summary: <specify the procedure action>
// Syntax:
//Thread_msg_desbloqueio ()
//
// Parameters:
// None
// Example:
// <Specify a usage example>
//
// Return value:// Automatic procedure:
// The procedure is automatically run, after the window initialization code, with a delay set to 1 second
// It will be run in a thread (without having to call ThreadExecute), without using HFSQL
// It will be repeated in a loop, with a timeout set to 1 second between each call
//

PROCEDURE Thread_msg_desbloqueio()

//quando o primeiro que entrou saiu, avisa o segundo que tentou

IF gnidlock > 0 THEN

HReset(sec023_lock_record)

IF HReadSeek(sec023_lock_record,sec023_id_loc,gnidlock,hIdentical) = True THEN

IF sec023_lock_record.sec023_status = False //desbloqueado

Info("O registro "+ gnidlock + " agora esta liberado!")

gnidlock = 0 ///STOP DA TREAD POR QUE ESTA ZERO

END

END

END

//----------------------------------------------------------------------------------------------GLOBAL DA JANELA

PROCEDURE MyWindow(plano)
//antes de abrir a janela
gnid is 8-byte int
gnidlock is 8-byte int
gsacao is string
gnTempoAberta is int

//-------------------------------------------------------------------------------------------------INIT GLOBAL DA JANELA

//janela aberta
IF plano < 3
MyWindow..Plane = 1
ELSE
MyWindow..Plane = 3
END

//---------------------------------------------------------------------------------------------------------CLOSE DA JANELA

// Summary: <specify the procedure action>
// Syntax:
// evento_incluir ()
//
// Parameters:
// None
// Return value:
// None
//
// Example:
// <Specify a usage example>
//
PROCEDURE evento_incluir()

GR_CAMPOS = ""

gsacao = "Incluir"

HReset(t001_pessoas)

MyWindow..Plane = 2

--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------

Illustrations, screen shots
none
none
User reviews
(To evaluate this resource, click 'Write a review')
No review or comment? Be the first one!