SET TRANSACTION [ ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE } ] [ READ WRITE | READ ONLY ] SET SESSION CHARACTERISTICS AS TRANSACTION [ ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE } ] [ READ WRITE | READ ONLY ]
O comando SET TRANSACTION define as características da transação corrente. Não produz nenhum efeito para as transações subseqüentes. O comando SET SESSION CHARACTERISTICS define o padrão das características das transações para as próximas transações na sessão. Estes padrões podem ser mudados pelo comando SET TRANSACTION para uma transação individual.
As características de transação disponíveis são o nível de isolamento da transação e o modo de acesso da transação (ler/escrever ou somente para leitura).
O nível de isolamento de uma transação determina quais dados a transação pode ver quando outras transações estão processando concorrentemente.
Dica: Intuitivamente, serializável significa que duas transações concorrentes deixam o banco de dados no mesmo estado que estas duas transações, executadas uma após a outra em qualquer ordem, deixariam.
O nível de isolamento da transação não pode ser mudado após a primeira consulta ou comando de modificação de dado da transação (SELECT, INSERT, DELETE, UPDATE, FETCH ou COPY) ter sido executado. Veja o Capítulo 12 para obter mais informações sobre o isolamento de transações e controle de concorrência.
O modo de acesso da transação determina se a transação lê e escreve, ou se é somente para leitura. Ler e escrever é o padrão. Quando a transação é somente para leitura, os seguintes comandos SQL não são permitidos: INSERT, UPDATE, DELETE e COPY TO se a tabela a ser escrita não for uma tabela temporária; todos os comandos CREATE, ALTER e DROP; COMMENT, GRANT, REVOKE, TRUNCATE; também EXPLAIN ANALYZE e EXECUTE se o comando a ser executado está entre os listados. Esta é uma noção de somente para leitura de alto nível, que não impede escritas no disco.
O nível de isolamento padrão da transação para a sessão também pode ser definido pelo comando
SET default_transaction_isolation = 'valor'
no arquivo de configuração. Consulte a Seção 16.4 para obter mais informações.
Os dois comandos estão definidos no padrão SQL. No padrão SQL SERIALIZABLE é o nível de isolamento padrão; no PostgreSQL normalmente o padrão é READ COMMITTED, mas pode ser mudado conforme mencionado acima. O PostgreSQL não possui os níveis de isolamento READ UNCOMMITTED e REPEATABLE READ. Devido à falta de bloqueio de predicado (predicate locking), o nível SERIALIZABLE não é verdadeiramente serializável. Veja o Capítulo 12 para obter detalhes.
No padrão SQL existe uma outra característica de transação que pode ser definida por estes comandos: o tamanho da área de diagnósticos. Este conceito só se aplica à linguagem SQL incorporada.