5
CONCORRÊNCIA 1. Introdução O termo concorrência se refere ao fato de que os SGBDs em geral permitem que muitas transações tenham acesso ao mesmo banco de dados ao mesmo tempo. Em um sistema desse tipo, é necessário algum tipo de mecanismo de controle (bloqueio) para assegurar que transações concorrentes não interfiram umas nas outras. Na situação ideal, cada um destes usuários deveria executar os seus comandos como se ele fosse o único. Este seria o maior nível de isolamento. Entretanto, é muito baixo o nível de concorrência correspondente a tal nível de isolamento e usuários poderão ficar aguardando por informações durante tempos relativamente longos, à espera do término de outras transações. Buscando aumentar os níveis de concorrência redução da espera em detrimento do isolamento, a SQL definiu alguns níveis de isolamento. SGBD Transação T1 concorre com T2 pelo recurso, (pode haver interferência em T2). Transação T2 concorre com T1 pelo recurso, (pode haver interferência em T1). 2. Transações e Concorrência (Níveis de Isolamento) Em um ambiente onde não existe isolamento entre as transações, a intercalação entre os comandos das transações pode produzir os seguintes problemas: Leitura Suja (ou Dependência sem commit) 1. Transações T1 e T2 são iniciadas. 2. A transação T1 modifica a linha L1. 3. A transação T2 lê a linha L1 antes que T1 termine. 4. T1 termina com fracasso e suas operações são desfeitas. Assim: T2 terá lido uma informação que nunca foi confirmada. BD (recurso)

CONCORRENCIA

Embed Size (px)

DESCRIPTION

CONCORRENCIA

Citation preview

  • CONCORRNCIA

    1. Introduo

    O termo concorrncia se refere ao fato de que os SGBDs em geral permitem que muitas transaes tenham acesso ao mesmo banco de dados ao mesmo tempo. Em um sistema desse tipo, necessrio algum tipo de mecanismo de controle (bloqueio) para assegurar que transaes concorrentes no interfiram umas nas outras.

    Na situao ideal, cada um destes usurios deveria executar os seus comandos como se ele fosse o nico. Este seria o maior nvel de isolamento.

    Entretanto, muito baixo o nvel de concorrncia correspondente a tal nvel de isolamento e usurios podero ficar aguardando por informaes durante tempos relativamente longos, espera do trmino de outras transaes.

    Buscando aumentar os nveis de concorrncia reduo da espera em detrimento do isolamento, a SQL definiu alguns nveis de isolamento.

    SGBD

    Transao T1 concorre com T2 pelo recurso, (pode haver interferncia em T2).

    Transao T2 concorre com T1 pelo recurso, (pode haver interferncia em T1).

    2. Transaes e Concorrncia (Nveis de Isolamento)

    Em um ambiente onde no existe isolamento entre as transaes, a intercalao entre os comandos das transaes pode produzir os seguintes problemas:

    Leitura Suja (ou Dependncia sem commit)

    1. Transaes T1 e T2 so iniciadas. 2. A transao T1 modifica a linha L1. 3. A transao T2 l a linha L1 antes que T1 termine. 4. T1 termina com fracasso e suas operaes so desfeitas.

    Assim: T2 ter lido uma informao que nunca foi confirmada.

    BD (recurso)

  • Leitura No-Repetida (ou anlise inconsistente)

    1. Transaes T1 e T2 so iniciadas. 2. A transao T1 l a linha L1. 3. A transao T2 modifica a linha L1, atualizando seus dados ou

    apagando a linha. 4. A transao T2 concluda com sucesso e as suas operaes

    so confirmadas. 5. A transao T1 l (ou tenta ler) a linha L1.

    Assim: T1 nunca modificou os dados da linha L1, mas no obteve a mesma leitura duas vezes dentro da mesma transao.

    Leitura Fantasma

    1. Transaes T1 e T2 so iniciadas. 2. A transao T1 l um conjunto de linhas que atendem a uma

    condio C1; 3. A transao T2 executa uma operao de atualizao que cria

    uma ou mais linhas que atendem condio C1; 4. A transao T1 l, novamente, um conjunto de linhas que

    atendem a uma condio C1.

    Assim: Embora T1 no tenha criado linhas que atendem condio C1, novas linhas participaro do resultado da consulta.

    Perda de Atualizao

    1. Transaes T1 e T2 so iniciadas. 2. A transao T1 l o dado D1 e armazena seu valor na varivel X. 3. A transao T2 l o dado D1 e armazena seu valor na varivel Y. 4. A transao T1 atualiza D1 com o valor 10. 5. A transao T2 atualiza D1 com o valor 11. 6. A transao T1 termina com sucesso. 7. A transao T2 termina com sucesso.

    Assim: Para a transao T1 o valor de D1 deveria ser 10 (mas 11).

  • No padro SQL existem quatro Nveis de Isolamento para indicar a relao do SGBD com os fenmenos listados acima.

    Nveis de isolamento definidos no padro SQL:

    serializable - Nvel de isolamento mais alto. Faz com que as operaes sejam executadas como se a transao em questo fosse a nica ocorrendo no sistema (este nvel de isolamento diminui o nvel de concorrncia).

    Bloqueia os dados acessados at o final da transao (aps commit ou rollback) e impede a insero de novas tuplas (linhas) nas tabelas em uso.

    repeatable read

    read committed

    read uncommitted

    Os quatro nveis de isolamento da SQL de acordo com a sua relao com os quatro fenmenos:

    NVEL DE ISOLAMENTO

    PROBLEMA Perda de

    Atualizao Leitura Suja

    Leitura No-repetida

    Leitura Fantasma

    READ UNCOMMITTED No permite Permite Permite Permite READ COMMITTED No permite No permite Permite Permite REPEATABLE READ No permite No permite No permite Permite

    SERIALIZABLE No permite No permite No permite No permite

    O nvel de isolamento a ser utilizado pode ser definido:

    - Atravs do comando de incio de uma transao:

    Padro SQL: START TRANSACTION [nvel-de-isolamento] SQL Server: BEGIN TRANSACTION [nvel-de-isolamento]

    - Pelo comando de alterao das propriedades da transao:

    SET TRANSACTION ISOLATION LEVEL [nvel-de-isolamento]

  • Exerccio 1:

    Simular uma situao de concorrncia e bloqueio. Use a tabela TBCONTA do banco de dados DBBANCO (cdigo de criao do banco\tabela na apostila de Transaes).

    Escreva duas transaes em janelas (NEW QUERY) diferentes do Management Studio.

    A primeira transao deve alterar um dado da tabela (o saldo da conta 123, por exemplo):

    Obs.: digite mas no execute a transao ainda.

    begin transaction update TBCONTA set saldo=saldo+1000 where conta=123 commit

    A segunda transao (em outra janela) deve ler este mesmo dado (o saldo da conta 123).

    Obs.: digite mas no execute a transao ainda.

    begin transaction select saldo from TBCONTA where conta=123 commit

    Selecione as duas primeiras linhas da primeira transao e clique no boto .

    V para a janela da segunda transao e clique no boto . O que aconteceu com a segunda transao? ___________________________ Por qu? _______________________________________________________

    Retorne janela da primeira transao, selecione apenas o comando COMMIT e clique no boto .

    Retorne janela da primeira transao. O que aconteceu? ________________________________________________ Por qu? _______________________________________________________

  • Exerccio 2:

    Anote o saldo atual da conta 123.

    Altere o cdigo da primeira transao:

    begin transaction update TBCONTA set saldo=saldo+1000 where conta=123 rollback

    Altere o cdigo na janela da segunda transao:

    set transaction isolation level read uncommitted begin transaction select saldo from TBCONTA where conta=123 commit

    Retorne janela da primeira transao e execute as duas primeiras linhas.

    Retorne janela da segunda transao e clique no boto . Qual o valor do saldo? _____________________________________________

    Retorne janela da primeira transao e execute apenas a ltima linha (rollback).

    Abra a tabela TBCONTA. Qual o saldo da conta 123? _________________________________________

    Que fenmeno que ocorreu na execuo da segunda transao?

    ____________________________________________________