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
INSERT
ouUPDATE
instruçã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.