SET TRANSACTION modo_da_transação [, ...] 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
O comando SET TRANSACTION define as características da transação corrente. Não produz nenhum efeito nas próximas transações. O comando SET SESSION CHARACTERISTICS define as características da transação usadas como padrão nas próximas transações na sessão. Estes padrões podem ser mudados para uma transação individual pelo comando SET TRANSACTION. [1] [2] [3] [4]
As características da transação disponíveis são o nível de isolamento da transação e o modo de acesso da transação (leitura/escrita 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 ao mesmo tempo.
O comando consegue ver apenas as linhas efetivadas (commit) antes do início da sua execução. Este é o padrão.
Todos os comandos da transação corrente podem ver apenas as linhas efetivadas antes da primeira consulta ou comando de modificação de dados ter sido executado nesta transação.
O padrão SQL define dois níveis adicionais, READ UNCOMMITTED e REPEATABLE READ. No PostgreSQL READ UNCOMMITTED é tratado como READ COMMITTED, enquanto REPEATABLE READ é tratado como SERIALIZABLE.
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 (SELECT, INSERT, DELETE, UPDATE, FETCH ou COPY) da transação ter sido executado. Para obter informações adicionais sobre o isolamento de transações e controle de simultaneidade deve ser consultado o Capítulo 12.
O modo de acesso da transação determina se a transação é para leitura/escrita, ou se é somente para leitura. Ler/escrever é o padrão. Quando a transação é somente para leitura, não são permitidos os seguintes comandos SQL: INSERT, UPDATE, DELETE e COPY FROM, 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 estiver entre os listados. Esta é uma noção de somente para leitura de alto nível, que não impede todas as escritas em disco.
Se for executado o comando SET TRANSACTION sem ser executado antes o comando START TRANSACTION ou BEGIN, parecerá que não produziu nenhum efeito, uma vez que a transação termina imediatamente.
É possível não utilizar o comando SET TRANSACTION, especificando o modo_da_transação desejado no comando BEGIN ou no comando START TRANSACTION.
Os modos de transação padrão da sessão também podem ser definidos através dos parâmetros de configuração default_transaction_isolation e default_transaction_read_only (De fato, SET SESSION CHARACTERISTICS é apenas uma forma verbosa equivalente a definir estas variáveis através do comando SET). Isto significa que os valores padrão podem ser definidos no arquivo de configuração, via ALTER DATABASE, etc. Para obter informações adicionais deve ser consultada a Seção 16.4 .
Os dois comandos estão definidos no padrão SQL. No padrão SQL SERIALIZABLE é o nível de isolamento padrão da transação; no PostgreSQL normalmente o padrão é READ COMMITTED, mas pode ser mudado conforme mencionado acima. Devido à falta de bloqueio de predicado, o nível SERIALIZABLE não é verdadeiramente serializável. Para obter mais informações deve ser consultada a Capítulo 12.
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 é específico da linguagem SQL incorporada e, portanto, não é implementado no servidor PostgreSQL.
O padrão SQL requer a presença de vírgulas entre os modo_da_transação sucessivos, mas por razões históricas o PostgreSQL permite que estas vírgulas sejam omitidas.
[1] |
Oracle — O comando SET TRANSACTION é utilizado para estabelecer a transação corrente como apenas de leitura ou de leitura e escrita, estabelecer o nível de isolamento, ou atribuir a sessão para um segmento de rollback especificado. As operações realizadas pelo comando SET TRANSACTION afetam apenas a transação corrente, não afetando outros usuários ou outras transações. A transação termina quando é executado o comando COMMIT ou o comando ROLLBACK. O banco de dados Oracle efetiva implicitamente a transação antes e após a execução de um comando da linguagem de definição de dados (DDL). A cláusula ISOLATION LEVEL especifica como as transações que contêm modificações no banco de dados são tratadas. A definição SERIALIZALE especifica o modo de isolamento da transação como serializável, conforme definido no padrão SQL92. Se a transação serializável contiver comando da linguagem de manipulação de dados (DML) que tenta atualizar qualquer recurso que possa ter sido atualizado por uma transação não efetivada no início da transação serializável, então o comando da DML falhará. A definição READ COMMITTED é o comportamento padrão de transação do banco de dados Oracle. Se a transação contiver comandos da DML requerendo bloqueios de linha mantidos por outras transações, então o comando da DML aguardará até os bloqueios de linha serem liberados. Oracle® Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01 (N. do T.) |
[2] |
SQL Server — O comando SET TRANSACTION ISOLATION LEVEL controla o comportamento de bloqueio e versão da linha dos comandos Transact-SQL emitidos por uma conexão com o SQL Server. Os níveis de isolamento são: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SNAPSHOT e SERIALIZABLE. SQL Server 2005 Books Online — SET TRANSACTION ISOLATION LEVEL (Transact-SQL) (N. do T.) |
[3] |
DB2 — O comando SET CURRENT ISOLATION atribui um valor ao registrador especial CURRENT ISOLATION. Este comando não está sob controle da transação. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.) |
[4] |
DB2 — O comando CHANGE ISOLATION LEVEL muda a maneira do DB2 isolar os dados de outros processos enquanto o banco de dados está sendo acessado. Os níveis de isolamento são: CS (cursor stability); NC (no commit). Não suportado pelo DB2; RR (repeatable read); RS (read stability); UR (uncommitted read). DB2 Version 9 for Linux, UNIX, and Windows (N. do T.) |