Você está na página 1de 5

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

BD
(recurso)

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.
2.
3.
4.

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

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

Leitura No-Repetida (ou anlise inconsistente)


1.
2.
3.

4.

5.

Transaes T1 e T2 so iniciadas.
A transao T1 l a linha L1.
A transao T2 modifica a linha L1, atualizando seus dados ou
apagando a linha.
A transao T2 concluda com sucesso e as suas operaes
so confirmadas.
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.
2.

3.

4.

Transaes T1 e T2 so iniciadas.
A transao T1 l um conjunto de linhas que atendem a uma
condio C1;
A transao T2 executa uma operao de atualizao que cria
uma ou mais linhas que atendem condio C1;
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.
2.
3.
4.
5.
6.
7.

Transaes T1 e T2 so iniciadas.
A transao T1 l o dado D1 e armazena seu valor na varivel X.
A transao T2 l o dado D1 e armazena seu valor na varivel Y.
A transao T1 atualiza D1 com o valor 10.
A transao T2 atualiza D1 com o valor 11.
A transao T1 termina com sucesso.
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

Perda de
Atualizao

PROBLEMA
Leitura
Leitura
Suja
No-repetida

Leitura
Fantasma

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

Permite

Permite

Permite

No permite

Permite

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


<EXECUTE>.

V para a janela da segunda transao e clique no boto <EXECUTE>.


O que aconteceu com a segunda transao? ___________________________
Por qu? _______________________________________________________

Retorne janela da primeira transao, selecione apenas o comando COMMIT


e clique no boto <EXECUTE>.

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 <EXECUTE>.
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?


____________________________________________________

Você também pode gostar