quarta-feira, 30 de maio de 2007

Os Comandos SET TRANSACTION e SET SESSION

Estes comandos definem o chamado transaction mode, característica que influencia a execução de uma transação. Dependendo do que for definido, o sistema poderá por exemplo obter um melhor desempenho sacrificando a aderência às desejáveis características ACID (Atomicidade, Consistência, Isolamento e Durabilidade). São apresentados junto na ajuda do PostgreSQL por terem função similar.

O transaction_mode é composto pelo nível de isolamento da transação e das permissões de uma transação para fazer leitura e escrita em um banco de dados.

Outros comandos podem afetar o transaction mode: START TRANSACTION e BEGIN. Nestes comandos é afetado o transaction mode da transação corrente. O comando SET TRANSACTION permite a alteração desta característica tanto para a transação corrente quanto para as subseqüentes.

SINTAXE:

SET TRANSACTION transaction_mode [, ...]
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]

Onde o transaction_mode pode assumir os seguintes valores:

ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY

Principais transaction modes:

- SERIALIZABLE - Fiel às características ACID, apresenta menor desempenho pois praticamente simula a execução sequencial de transações. A transação poderá ver apenas os dados já efetivados no banco antes do início da execução da transação. Isto é, não poderá por exemplo ler dados inseridos após o seu início.

- REPEATABLE READ - Mais flexível, apresenta melhor desempenho em relação ao anterior. A transação poderá ler os mesmos dados várias vezes durante sua execução e o valor será o mesmo.

- READ COMMITTED - Mais flexível e com melhor desempenho em relação ao anterior. A transação poderá ler os mesmos dados várias vezes durante sua execução e o valor lido será diferente caso o dado tenha sido atualizado por outra transação que tenha feito COMMIT explícito ou implícito.

- READ UNCOMMITTED - Apresenta o melhor desempenho em relação às demais. No entanto não é fiel às características ACID. Neste caso a transação poderá ler os mesmos dados várias vezes durante sua execução e o valor lido será diferente caso o dado tenha sido atualizado por outra transação que tenha feito ou não COMMIT.

Exemplos:

1 - Altera a transação corrente para SERIALIZABLE

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

2 - Altera a transação corrente para READ COMMITTED

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

3 - Altera a transação corrente para SERIALIZABLE

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

4 - Altera a transação corrente para READ UNCOMMITTED

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

5 - Define que a transação corrente será SERIALIZABLE com permissão de leitura e escrita

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE

6 - Define que a transação corrente será SERIALIZABLE com permissão apenas para leitura de dados

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY

7 - Altera as transações subseqüentes para SERIALIZABLE

SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE

8 - Altera as transações subseqüentes para REPEATABLE READ

SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ

9 - Altera as transações subseqüentes para READ COMMITTED

SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED

10 - Altera as transações subseqüentes para READ UNCOMMITTED

SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

11 - Altera as transações subseqüentes para SERIALIZABLE com permissão para leitura e escrita

SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE

12 - Altera as transações subseqüentes para REPEATABLE READ com permissão apenas para leitura

SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY