Resumo :neste tutorial, mostraremos como usar a transação SQLite para garantir a integridade e confiabilidade dos dados.
SQLite &ACID
SQLite é um banco de dados transacional em que todas as alterações e consultas são atômicas, consistentes, isoladas e duráveis (ACID).
O SQLite garante que todas as transações sejam compatíveis com ACID, mesmo que a transação seja interrompida por uma falha de programa, despejo do sistema operacional ou falha de energia no computador.
- A tomic:uma transação deve ser atômica. Isso significa que uma mudança não pode ser dividida em outras menores. Quando você confirma uma transação, toda a transação é aplicada ou não.
- C onsistent:uma transação deve garantir a mudança do banco de dados de um estado válido para outro. Quando uma transação inicia e executa uma instrução para modificar dados, o banco de dados se torna inconsistente. No entanto, quando a transação é confirmada ou revertida, é importante que a transação mantenha o banco de dados consistente.
- Eu solation:uma transação pendente realizada por uma sessão deve ser isolada de outras sessões. Quando uma sessão inicia uma transação e executa o comando
INSERTouUPDATEinstrução para alterar os dados, essas alterações são visíveis apenas para a sessão atual, não para outras. Por outro lado, as alterações confirmadas por outras sessões após o início da transação não devem ser visíveis para a sessão atual. - Durável:se uma transação for confirmada com sucesso, as alterações devem ser permanentes no banco de dados, independentemente da condição, como falha de energia ou falha do programa. Pelo contrário, se o programa travar antes que a transação seja confirmada, a alteração não deve persistir.
Instruções de transação SQLite
Por padrão, o SQLite opera no modo de confirmação automática. Isso significa que, para cada comando, o SQLite inicia, processa e confirma a transação automaticamente.
Para iniciar uma transação explicitamente, você usa as seguintes etapas:
Primeiro, abra uma transação emitindo o
BEGIN TRANSACTION comando. BEGIN TRANSACTION;Code language: SQL (Structured Query Language) (sql) Após executar a instrução
BEGIN TRANSACTION , a transação fica aberta até que seja explicitamente confirmada ou revertida. Segundo, emita instruções SQL para selecionar ou atualizar dados no banco de dados. Observe que a alteração é visível apenas para a sessão atual (ou cliente).
Terceiro, confirme as alterações no banco de dados usando o comando
COMMIT ou COMMIT TRANSACTION demonstração. COMMIT;Code language: SQL (Structured Query Language) (sql) Se você não quiser salvar as alterações, você pode reverter usando o
ROLLBACK ou ROLLBACK TRANSACTION demonstração:ROLLBACK;Code language: SQL (Structured Query Language) (sql) Exemplo de transação SQLite
Criaremos duas novas tabelas:
accounts e account_changes para a demonstração. As
accounts A tabela armazena dados sobre os números das contas e seus saldos. As account_changes tabela armazena as alterações das contas. Primeiro, crie as
accounts e account_changes tabelas usando o seguinte CREATE TABLE declarações:CREATE TABLE accounts (
account_no INTEGER NOT NULL,
balance DECIMAL NOT NULL DEFAULT 0,
PRIMARY KEY(account_no),
CHECK(balance >= 0)
);
CREATE TABLE account_changes (
change_no INT NOT NULL PRIMARY KEY,
account_no INTEGER NOT NULL,
flag TEXT NOT NULL,
amount DECIMAL NOT NULL,
changed_at TEXT NOT NULL
);Code language: SQL (Structured Query Language) (sql) Segundo, insira alguns dados de amostra nas
accounts tabela. INSERT INTO accounts (account_no,balance)
VALUES (100,20100);
INSERT INTO accounts (account_no,balance)
VALUES (200,10100);
Code language: SQL (Structured Query Language) (sql) Terceiro, consulte os dados das
accounts tabela:SELECT * FROM accounts;Code language: SQL (Structured Query Language) (sql)
Quarto, transfira 1000 da conta 100 para 200 e registre as alterações na tabela
account_changes em uma única transação. BEGIN TRANSACTION;
UPDATE accounts
SET balance = balance - 1000
WHERE account_no = 100;
UPDATE accounts
SET balance = balance + 1000
WHERE account_no = 200;
INSERT INTO account_changes(account_no,flag,amount,changed_at)
VALUES(100,'-',1000,datetime('now'));
INSERT INTO account_changes(account_no,flag,amount,changed_at)
VALUES(200,'+',1000,datetime('now'));
COMMIT;Code language: SQL (Structured Query Language) (sql) Quinto, consultar dados das
accounts tabela:SELECT * FROM accounts;Code language: SQL (Structured Query Language) (sql)
Como você pode ver, os saldos foram atualizados com sucesso.
Sexto, consulte o conteúdo das
account_changes tabela:SELECT * FROM account_changes;Code language: SQL (Structured Query Language) (sql)
Vamos dar outro exemplo de reversão de uma transação.
Primeiro, tente deduzir 20.000 da conta 100:
BEGIN TRANSACTION;
UPDATE accounts
SET balance = balance - 20000
WHERE account_no = 100;
INSERT INTO account_changes(account_no,flag,amount,changed_at)
VALUES(100,'-',20000,datetime('now'));Code language: SQL (Structured Query Language) (sql) SQLite emitiu um erro devido ao saldo insuficiente:
[SQLITE_CONSTRAINT] Abort due to constraint violation (CHECK constraint failed: accounts)Code language: CSS (css) No entanto, o registro foi salvo em
account_changes tabela:SELECT * FROM account_changes;Code language: SQL (Structured Query Language) (sql)
Segundo, reverta a transação usando o
ROLLBACK demonstração:ROLLBACK;Code language: SQL (Structured Query Language) (sql) Por fim, consulte os dados do
account_changes table, você verá que a mudança nº 3 não está mais lá:SELECT * FROM account_changes;Code language: SQL (Structured Query Language) (sql)
Neste tutorial, você aprendeu como lidar com transações SQLite usando o comando
BEGIN TRANSACTION , COMMIT e ROLLBACK instruções para controlar as transações no banco de dados SQLite.