SET TRANSACTION — define as características da transação corrente
SET TRANSACTIONmodo_da_transação[, ...] SET TRANSACTION SNAPSHOTid_do_instantâneoSET SESSION CHARACTERISTICS AS TRANSACTIONmodo_da_transação[, ...] ondemodo_da_transaçãoé um entre: ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED } READ WRITE | READ ONLY [ NOT ] DEFERRABLE
O comando SET TRANSACTION define as
características da transação corrente.
Não afeta nenhuma transação subsequente.
O comando SET SESSION CHARACTERISTICS
define as características de transação padrão para as transações
subsequentes da sessão.
Estes padrões podem ser substituídos 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, o modo de acesso da transação (leitura/escrita ou leitura-apenas) e o modo postergável. Além disso, pode ser selecionado um instantâneo, embora apenas para a transação corrente, e não como um padrão da sessão.
O nível de isolamento da transação determina quais dados a transação pode ver quando outras transações estão sendo executadas simultaneamente:
READ COMMITTEDA instrução só pode ver as linhas efetivadas antes de seu início. Este é o comportamento padrão.
REPEATABLE READTodas as instruções da transação corrente só podem ver as linhas efetivadas antes da primeira consulta ou instrução de modificação de dados ser executada nesta transação.
SERIALIZABLE
Todas as instruções da transação corrente só podem ver as linhas
efetivadas antes da primeira consulta ou instrução de modificação
de dados ser executada nesta transação.
Se um padrão de leituras e escritas entre as transações
serializáveis concorrentes criar uma situação que não poderia
ter ocorrido para qualquer execução serial (uma por vez) dessas
transações, uma delas será desfeita com um erro de
serialization_failure.
O padrão SQL define o nível adicional
READ UNCOMMITTED.
No PostgreSQL
READ UNCOMMITTED é tratado como
READ COMMITTED.
O nível de isolamento da transação não pode ser alterado após a
primeira consulta ou instrução de modificação de dados
(SELECT, INSERT,
DELETE, UPDATE,
MERGE, FETCH ou
COPY) da transação ter sido executada.
Veja Controle de concorrência para obter mais informações sobre o
isolamento de transação e controle de simultaneidade.
O modo de acesso da transação determina se a transação é de
leitura/escrita ou de leitura-apenas.
Leitura/escrita é o padrão.
Quando uma transação é de leitura-apenas, os seguintes comandos
SQL não são permitidos:
INSERT, UPDATE,
DELETE, MERGE e
COPY FROM
se a tabela a ser escrita não for uma tabela temporária;
todos os comandos CREATE, ALTER
e DROP; os comandos
COMMENT, GRANT,
REVOKE, TRUNCATE; e os comandos
EXPLAIN ANALYZE e EXECUTE
se o comando a ser executado estiver entre os listados.
Esta é uma noção de alto nível de leitura-apenas, que não impede
todas as escritas no disco.
A propriedade de transação DEFERRABLE (postergável)
não tem efeito, a menos que a transação também seja
SERIALIZABLE e READ ONLY.
Quando todas estas três propriedades são selecionadas para uma
transação, a transação pode ficar bloqueada ao adquirir seu
instantâneo pela primeira vez, após o que pode ser executada sem a
sobrecarga normal de uma transação SERIALIZABLE,
e sem qualquer risco de contribuir ou ser cancelada por uma falha de
serialização.
Este modo é adequado para relatórios ou cópias de segurança de
execução longa.
O comando SET TRANSACTION SNAPSHOT permite que
uma nova transação seja executada com o mesmo
instantâneo de uma transação existente.
A transação pré-existente deve ter exportado seu instantâneo com a
função pg_export_snapshot
(veja Funções de sincronização de instantâneo).
Esta função retorna um identificador de instantâneo, que deve ser
fornecido para SET TRANSACTION SNAPSHOT para
especificar qual instantâneo deve ser importado.
O identificador deve ser escrito como um literal de cadeia de caracteres
neste comando, por exemplo '00000017-00000002-1'.
O comando SET TRANSACTION SNAPSHOT só pode ser
executado no início de uma transação, antes da primeira consulta ou
comando de modificação de dados (SELECT,
INSERT, DELETE,
UPDATE, MERGE,
FETCH ou COPY) da transação.
Além disso, a transação já deve estar configurada para o nível de
isolamento SERIALIZABLE ou
REPEATABLE READ (caso contrário, o instantâneo
seria descartado imediatamente, porque o modo
READ COMMITTED usa um novo instantâneo para cada
comando).
Se a transação de importação usar o nível de isolamento
SERIALIZABLE, a transação que exportou o
instantâneo também deverá usar este nível de isolamento.
Além disso, uma transação serializável que não seja de leitura-apenas
não pode importar um instantâneo de uma transação de leitura-apenas.
Se o comando SET TRANSACTION for executado sem um
comando START TRANSACTION ou BEGIN
anterior, será emitida uma advertência e não haverá nenhum efeito.
É possível dispensar o comando SET TRANSACTION
especificando o valor desejado para o
modo_da_transação
no comando BEGIN ou
START TRANSACTION.
Mas esta opção não está disponível para
SET TRANSACTION SNAPSHOT.
Os modos de transação padrão da sessão também podem ser definidos
ou examinados por meio dos parâmetros de configuração
default_transaction_isolation,
default_transaction_read_only e
default_transaction_deferrable.
(Na verdade, SET SESSION CHARACTERISTICS é apenas
uma forma equivalente detalhada para definir estas variáveis com
o comando SET.)
Isto significa que os padrões podem ser definidos no arquivo de
configuração, via ALTER DATABASE, etc.
Veja Configuração do servidor para obter mais informações.
Os modos da transação corrente também podem ser definidos ou
examinados por meio dos parâmetros de configuração
transaction_isolation,
transaction_read_only e
transaction_deferrable.
Definir um desses parâmetros funciona da mesma forma que a opção
SET TRANSACTION correspondente, com as mesmas
restrições sobre quando isto pode ser feito.
Entretanto, estes parâmetros não podem ser definidos no arquivo
de configuração, ou em qualquer fonte que não seja o
SQL ao vivo.
Para iniciar uma nova transação com o mesmo instantâneo de uma transação já existente, primeiro é exportado o instantâneo da transação existente. Isto retorna o identificador do instantâneo. Por exemplo:
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; SELECT pg_export_snapshot();
pg_export_snapshot --------------------- 00000017-00000002-1 (1 linha)
Em seguida, deve ser fornecido o identificador do instantâneo em um
comando SET TRANSACTION SNAPSHOT no início da
transação recém-aberta:
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET TRANSACTION SNAPSHOT '00000017-00000002-1';
Estes comandos são definidos no padrão SQL,
exceto para o modo de transação DEFERRABLE e a
forma SET TRANSACTION SNAPSHOT, que são extensões
do PostgreSQL.
No padrão SQL, SERIALIZABLE
é o nível de isolamento de transação padrão.
No PostgreSQL, o padrão é normalmente
READ COMMITTED, mas pode ser alterado conforme
mencionado acima.
No padrão SQL existe outra característica de transação que pode ser definida com estes comandos: o tamanho da área de diagnóstico. Este conceito é específico para o SQL incorporado, portanto, não é implementado no servidor PostgreSQL.
O padrão SQL requer vírgulas entre os
modo_da_transação,
mas por razões históricas o PostgreSQL
permite que as vírgulas sejam omitidas.