140 likes | 263 Views
PostGres - Transacções. TBD Vladimir Luz. Sumário. Níveis de isolamento Read Committed Serializable Gestor de Transacções MVCC Locks Deadlock Locks em Índices. Níveis de Isolamento (1).
E N D
PostGres - Transacções TBD Vladimir Luz
Sumário • Níveis de isolamento • Read Committed • Serializable • Gestor de Transacções • MVCC • Locks • Deadlock • Locks em Índices
Níveis de Isolamento (1) • No SQL estão definidos quatro tipos de isolamento de transacções em função de três fenómenos que devem ser evitados • Dirty read – uma transacção lê dados escritos por uma transacção que ainda não fez commit • Nonrepeatable read – Uma transacção lê dados que já tinha lido antes e que entretanto foram modificados por outra transacção que fez commit • Phantom read – uma transacção volta a executar uma query devolvendo um conjunto de tuplos e verifica que o conjunto dos tuplos devolvidos é diferente da execução anterior
Níveis de Isolamento (2) • Níveis de isolamento e comportamento • Pode ser requerido qualquer dos níveis de isolamento • Internamente: • Apenas existe os níveis read commited e serializable • read uncommitted é tratado como read committed e o repeated read é tratado como serializable • Os quatro níveis apenas determinam que fenómenos não podem ocorrer
Níveis de Isolamento (3) • Read Committed • Nível de isolamento por defeito no PostGres • Um SELECT vê apenas dados que já fizeram commit. • Vê um snapshot da base de dados na altura em que começa a query • Comandos de UPDATE e DELETE comportam se da mesma forma
Níveis de Isolamento (4) • Serializable • Simula as execução das transacções em série como se elas fossem executadas uma depois da outra • No caso de SELECT o funcionamento é análogo ao read commited • Difere no snapshot que vê, pois vê o snapshot na altura do início da transacção • Comandos de UPDATE E DELETE também vêem o snapshot do inicio da transacção
Gestor de Transacções • Usa um modelo multi-versão • Multiversion Concurrency Control, MVCC • Usado em Statements DML • Usa um sistema de locks • Two-Phase-Locking • Usado em statements DDL
MVCC(1) • MVCC • A ideia é mater duas versões de uma linha que corresponde a diferentes instancias da linha em pontos diferentes no tempo • Garante que as transacções apenas vêem os dados que são consistentes nessa altura • Vê um snapshot da base de dados com apenas os dados que fizeram commit • Não implementa locks para os comandos DML
MVCC (2) • Vantagens • Os leitores nunca bloqueiam os escritores • Os escritores criam as suas próprias para as actualizarem • Os leitores acedem a versão mais recente dos dados que é parte do snapshot. • Como não usa locks não precisa interagir com o lock manager
MVCC (3) • Desvantagens • Sobrecarga extra para o storage manager porque tem de manter diferentes versões para os tuplos • O desenvolvimento de aplicações concorrentes requer mais cuidado, pois leva a diferentes comportamentos na forma como as transacções se comportam. • A performance depende das características da carga de trabalho a correr • Não protege em relação a procedimentos que afectem a tabela inteira
Locks • Usa um sistema de two-phase locking • Comandos DDL são forçados a adquirir um lock antes de iniciarem a sua execução • Locks são guardados numa tabela de locks que é implementada com uma tabela de hash de memória partilhada. • Os locks são implementados através de semáforos • Cada transacção tem um semáforo associado a ela
Deadlocks • A detecção de deadlocks é baseada num sistema de time-outs • O sistema de detecção é activado se uma transacção espera por mais de um segundo pela obtenção de um lock • O algoritmo constrói um grafo baseado na informação na tabela de locks e procura dependências circulares • Se encontrar alguma, então é porque há um deadlock • A transacção que originou a detecção é abortada e retorna um erro para o utilizador • Caso contrario continua a espera do lock
Locks em Índices • Os locks dependem do tipo de índice • B-Tree e GiST • Locks partilha/exclusivos ao nível das paginas • Locks são libertados logo depois de cada folha é acedida • Não origina deadlocks • Hash • Locks partilha/exclusivos ao nível dos buckets • Melhor nível de concorrência mas pode gerar deadlocks • R-Tree • Locks partilha/exclusivos ao nível do índice • Locks libertados depois de todo o comando estar terminado
Bibliografia • Silberschatz, Abraham, Database System Concepts, 5ª Edição • PostgreSQL 8.1.0 Documentation • Lane, Tom, Transaction Processing in PostgreSQL