SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Transação SQLite


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 ou UPDATE 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.