SET TRANSACTION

SET TRANSACTION — define as características da transação corrente

Sinopse

SET TRANSACTION modo_da_transação [, ...]
SET TRANSACTION SNAPSHOT id_do_instantâneo
SET SESSION CHARACTERISTICS AS TRANSACTION modo_da_transação [, ...]

onde modo_da_transação é um entre:

    ISOLATION LEVEL {
        SERIALIZABLE
      | REPEATABLE READ
      | READ COMMITTED
      | READ UNCOMMITTED
    }
    READ WRITE | READ ONLY
    [ NOT ] DEFERRABLE

Descrição

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 COMMITTED

A instrução só pode ver as linhas efetivadas antes de seu início. Este é o comportamento padrão.

REPEATABLE READ

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.

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.

Notas

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.

Exemplos

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';

Conformidade

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.