Em Structured Query Language, TCL é uma abreviação de Transaction Control Language. Uma única unidade de trabalho em um banco de dados é formada após a execução consecutiva de comandos ser conhecida como transação.
Existem alguns comandos na Linguagem de Consulta Estruturada, e o comando Linguagem de Controle de Transação é um dos comandos SQL. Comandos TCL manipulam as transações em um banco de dados
Em Structured Query Language, Commit, Rollback e Savepoint são os comandos da Transaction Control Language amplamente utilizados em SQL.
Agora vamos entender e aprender como os comandos da Linguagem de Controle de Transações funcionam na linguagem de Consulta Estruturada com a ajuda de alguns exemplos. Os comandos da Linguagem de Controle de Transação são:
- Comando COMMIT
- Comando ROLLBACK
- Comando SAVEPOINT
Comando COMMIT
O comando Commit em SQL é usado para salvar todas as transações que mudam permanentemente no disco. Sempre que realizamos a operação nos comandos da Linguagem de Definição de Dados (DDL), como o comando INSERT, o comando UPDATE e o comando DELETE, quaisquer modificações feitas por esses comandos são permanentes, mas antes de fechar a sessão atual ou até o final da sessão. Podemos desfazer facilmente a operação que realizamos usando a linguagem de definição de dados antes que a sessão seja encerrada. O comando Commit é usado para salvar a modificação permanentemente no armazenamento sem que a sessão seja encerrada.
Sintaxe:
COMMIT;
Se você tiver um banco de dados existente no sistema, use esse banco de dados existente ou crie um novo banco de dados. Usaremos o banco de dados existente da Empresa.
USE Company
Considere as tabelas de funcionários já existentes que possuem determinados dados:
EMPLOYEEID | FIRST_NAME | LAST_NAME | SALÁRIO | CIDADE | DEPARTAMENTO | GERENTE |
1001 | VAIBHAVI | MISHRA | 65.000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60.000 | NOIDA | ORACLE | 1 |
1003 | NIQUIL | VANI | 50.000 | JAIPUR | FMW | 2 |
2001 | PRAQUI | SHARMA | 55500 | CHANDIGARH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50.000 | MUMBAI | TESTE | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | QUERER | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | TESTE | 4 |
No SQL, a consulta START TRANSACTION é usada para iniciar a transação.
START TRANSACTION;
Agora, vamos inserir dois registros na tabela Employees existente. Para inserir vários registros, usaremos a instrução abaixo:
INSERT INTO EMPLOYEES (EMPLOYEEID, FIRST_NAME, LAST_NAME, SALARY, CITY, DEPARTMENT, MANAGERID) VALUES (4002, 'ASHWINI', 'BAGHAT', 54500, 'JAIPUR', 'JAVA', 3), (4003, 'PURVA', 'DHANDEKAR', 57000, 'PUNE', 'TESTING', 4);
Agora usaremos a consulta SELECT para verificar se os registros foram inseridos com sucesso ou não na tabela.
SELECT * FROM EMPLOYEES;
Resultado na consulta acima:
EMPLOYEEID | FIRST_NAME | LAST_NAME | SALÁRIO | CIDADE | DEPARTAMENTO | GERENTE |
1001 | VAIBHAVI | MISHRA | 65.000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60.000 | NOIDA | ORACLE | 1 |
1003 | NIQUIL | VANI | 50.000 | JAIPUR | FMW | 2 |
2001 | PRAQUI | SHARMA | 55500 | CHANDIGARH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50.000 | MUMBAI | TESTE | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | QUERER | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | TESTE | 4 |
4002 | ASHWINI | BOLSA | 54500 | JAIPUR | JAVA | 3 |
4003 | PURVA | DHANDEKAR | 57.000 | PUNE | TESTE | 4 |
A saída mostra que todos os registros foram inseridos com sucesso.
Para salvar a operação INSERT na tabela Employees, executaremos o comando COMMIT.
COMMIT;
No SQL, por padrão, a confirmação automática está ativada. Para desativar a confirmação automática no SQL, defina o valor de confirmação automática como 0.
Atualizaremos o ID do funcionário 4002 e definiremos a cidade como 'Noida. Use a consulta abaixo para atualizar o registro do funcionário.
UPDATE EMPLOYEES SET CITY = 'NOIDA' WHERE EMPLOYEEID = 4002;
Agora usaremos a consulta SELECT para verificar se o registro foi atualizado com sucesso ou não na tabela.
SELECT * FROM EMPLOYEES;
Resultado na consulta acima:
EMPLOYEEID | FIRST_NAME | LAST_NAME | SALÁRIO | CIDADE | DEPARTAMENTO | GERENTE |
1001 | VAIBHAVI | MISHRA | 65.000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60.000 | NOIDA | ORACLE | 1 |
1003 | NIQUIL | VANI | 50.000 | JAIPUR | FMW | 2 |
2001 | PRAQUI | SHARMA | 55500 | CHANDIGARH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50.000 | MUMBAI | TESTE | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | QUERER | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | TESTE | 4 |
4002 | ASHWINI | BOLSA | 54500 | NOIDA | JAVA | 3 |
4003 | PURVA | DHANDEKAR | 57.000 | PUNE | TESTE | 4 |
Como podemos ver na saída, a cidade do ID do funcionário 4002 foi modificada.
Para salvar as alterações na tabela dos funcionários, escreveremos um comando COMMIT.
COMMIT;
Agora, vamos excluir o ID do funcionário 4003 da tabela Funcionários. Use a consulta abaixo para excluir o registro do funcionário.
DELETE FROM EMPLOYEES WHERE EMPLOYEEID = 4003;
Agora usaremos a consulta SELECT para verificar se o registro foi excluído com sucesso ou não na tabela.
SELECT * FROM EMPLOYEES;
Resultado na consulta acima:
EMPLOYEEID | FIRST_NAME | LAST_NAME | SALÁRIO | CIDADE | DEPARTAMENTO | GERENTE |
1001 | VAIBHAVI | MISHRA | 65.000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60.000 | NOIDA | ORACLE | 1 |
1003 | NIQUIL | VANI | 50.000 | JAIPUR | FMW | 2 |
2001 | PRAQUI | SHARMA | 55500 | CHANDIGARH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50.000 | MUMBAI | TESTE | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | QUERER | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | TESTE | 4 |
4002 | ASHWINI | BOLSA | 54500 | NOIDA | JAVA | 3 |
A saída confirma que excluímos os detalhes do ID do funcionário 4003.
Para salvar as alterações na tabela dos funcionários, escreveremos um comando COMMIT.
COMMIT;
Comando SAVEPOINT
As operações de banco de dados realizadas podem ser divididas em duas partes. Por exemplo, considere todas as instruções de exclusão que realizamos como um segmento da transação e a instrução de atualização como um segmento da transação. Para salvar consultas de inserção na parte de inserção e consultas de exclusão na parte de exclusão da mesma transação, usamos o comando SAVEPOINT no SQL. Suponha que queremos salvar todas as consultas relacionadas à exclusão com o ponto de salvamento denominado delete. Para salvar todas as operações relacionadas à exclusão em um ponto de salvamento, temos que executar o comando SAVEPOINT seguido do nome do ponto de salvamento após realizar a consulta de exclusão.
Sintaxe:
SAVEPOINT savepoint name;
Comando ROLLBACK
Ao realizar uma transação, construímos os pontos de salvamento para salvar os diferentes segmentos da transação. À medida que os requisitos do usuário mudam, o usuário pode desfazer a transação para diferentes pontos de salvamento. Considere um cenário:Iniciamos uma transação seguida pela criação da tabela e inserção do registro na tabela. Construímos o ponto de salvamento INS nomeado após adicionar registros à tabela. Após a Inserção, realizamos a operação de exclusão e, posteriormente, lembramos que excluímos erroneamente os registros errados. Iremos desfazer nossa transação para alcançar o ponto de salvamento INS. Para desfazer a transação, use o comando ROLLBACK.
Podemos reverter a operação que realizamos ou reverter toda a transação do ponto de salvamento.
Sintaxe para reverter a operação:
ROLLBACK;
Sintaxe para reverter a transação:
ROLLBACK TO savepoint;
Exemplos dos comandos SAVEPOINT e ROLLBACK:
Se você tiver um banco de dados existente no sistema, use esse banco de dados existente ou crie um novo banco de dados. Vamos selecionar o banco de dados já existente chamado Empresa.
USE Company
Considere as tabelas de funcionários existentes que possuem os seguintes registros:
EMPLOYEEID | FIRST_NAME | LAST_NAME | SALÁRIO | CIDADE | DEPARTAMENTO | GERENTE |
1001 | VAIBHAVI | MISHRA | 65.000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60.000 | NOIDA | ORACLE | 1 |
1003 | NIQUIL | VANI | 50.000 | JAIPUR | FMW | 2 |
2001 | PRAQUI | SHARMA | 55500 | CHANDIGARH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50.000 | MUMBAI | TESTE | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | QUERER | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | TESTE | 4 |
4002 | ASHWINI | BOLSA | 54500 | NOIDA | JAVA | 3 |
No SQL, a consulta START TRANSACTION é usada para iniciar a transação.
START TRANSACTION;
Agora, vamos inserir dois registros na tabela Employees existente. Para inserir vários registros, usaremos a instrução abaixo:
INSERT INTO EMPLOYEES (EMPLOYEEID, FIRST_NAME, LAST_NAME, SALARY, CITY, DEPARTMENT, MANAGERID) VALUES (4003, 'PURVA', 'DHANDEKAR', 57000, 'PUNE', 'TESTING', 4), (5001, 'ASHWIN', 'PATEL', 54500, 'JAIPUR', 'JAVA', 3);
Agora usaremos a consulta SELECT para verificar se os registros foram inseridos com sucesso ou não na tabela.
SELECT * FROM EMPLOYEES;
Resultado na consulta acima:
EMPLOYEEID | FIRST_NAME | LAST_NAME | SALÁRIO | CIDADE | DEPARTAMENTO | GERENTE |
1001 | VAIBHAVI | MISHRA | 65.000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60.000 | NOIDA | ORACLE | 1 |
1003 | NIQUIL | VANI | 50.000 | JAIPUR | FMW | 2 |
2001 | PRAQUI | SHARMA | 55500 | CHANDIGARH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50.000 | MUMBAI | TESTE | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | QUERER | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | TESTE | 4 |
4002 | ASHWINI | BOLSA | 54500 | NOIDA | JAVA | 3 |
4003 | PURVA | DHANDEKAR | 57.000 | PUNE | TESTE | 4 |
5001 | ASHWIN | PATEL | 54500 | JAIPUR | JAVA | 3 |
Como todos sabemos, o comando SAVEPOINT em SQL é usado para salvar diferentes partes da mesma transação. Suponha que a Inserção seja um segmento de nossa transação. Use o ponto de salvamento para salvar este segmento de inserção como Inserção.
SAVEPOINT Insertion;
Agora, realizaremos a operação UPDATE nas tabelas Employee e atualizaremos o salário do funcionário em 1,2 para o ID do funcionário 2003.
UPDATE EMPLOYEES SET SALARY = SALARY * 1.2 WHERE EMPLOYEEID = 2003;
Faremos uma verificação cruzada da operação de atualização executando a consulta SELECT na tabela Employees:
SELECT * FROM EMPLOYEES WHERE EMPLOYEEID = 2003;
EMPLOYEEID | FIRST_NAME | LAST_NAME | SALÁRIO | CIDADE | DEPARTAMENTO | GERENTE |
2003 | RUCHIKA | JAIN | 60.000 | MUMBAI | TESTE | 4 |
Os resultados da consulta acima mostram que o registro de ID de funcionário 2003 foi atualizado com êxito.
Considere a consulta de atualização como um segmento de nossa transação. Salvaremos a parte da operação de atualização usando um SAVEPOINT chamado Updation.
SAVEPOINT Updation;
Agora, realizaremos uma operação de exclusão na tabela Funcionários. Realizaremos a operação de exclusão na tabela de funcionários onde o salário do funcionário é maior que 60.000.
DELETE FROM EMPLOYEES WHERE SALARY > 60000;
Faremos uma verificação cruzada da operação de exclusão executando a consulta SELECT na tabela Funcionários:
SELECT * FROM EMPLOYEES;
Resultado na consulta acima:
EMPLOYEEID | FIRST_NAME | LAST_NAME | SALÁRIO | CIDADE | DEPARTAMENTO | GERENTE |
1002 | VAIBHAV | SHARMA | 60.000 | NOIDA | ORACLE | 1 |
1003 | NIQUIL | VANI | 50.000 | JAIPUR | FMW | 2 |
2001 | PRAQUI | SHARMA | 55500 | CHANDIGARH | ORACLE | 1 |
2003 | RUCHIKA | JAIN | 60.000 | MUMBAI | TESTE | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | QUERER | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4002 | ASHWINI | BOLSA | 54500 | NOIDA | JAVA | 3 |
4003 | PURVA | DHANDEKAR | 57.000 | PUNE | TESTE | 4 |
5001 | ASHWIN | PATEL | 54500 | JAIPUR | JAVA | 3 |
A consulta acima mostra que a exclusão dos registros de funcionários foi bem-sucedida.
Considere as consultas de exclusão como um segmento de nossa transação. Salvaremos a parte da operação de atualização usando um SAVEPOINT chamado Deletion.
SAVEPOINT Deletion;
De repente, o usuário percebeu que a consulta que queríamos realizar na operação de exclusão não deveria ser essa consulta. Em tal situação, os usuários reverterão a transação inteira para o SAVEPOINT; o usuário pode reverter para qualquer SAVEPOINT que ele queira reverter como Inserção, Atualização SAVEPOINT.
ROLLBACK TO Insertion;
Se o usuário não quiser remover os registros. Portanto, o usuário será revertido para o SAVEPOINT de inserção.
Para verificar se temos a mesma tabela de funcionários que tínhamos antes de realizar as operações de atualização e exclusão. Para recuperar os detalhes dos funcionários, execute a operação SELECT na tabela dos funcionários.
SELECT * FROM EMPLOYEES;
EMPLOYEEID | FIRST_NAME | LAST_NAME | SALÁRIO | CIDADE | DEPARTAMENTO | GERENTE |
1001 | VAIBHAVI | MISHRA | 65.000 | PUNE | ORACLE | 1 |
1002 | VAIBHAV | SHARMA | 60.000 | NOIDA | ORACLE | 1 |
1003 | NIQUIL | VANI | 50.000 | JAIPUR | FMW | 2 |
2001 | PRAQUI | SHARMA | 55500 | CHANDIGARH | ORACLE | 1 |
2002 | BHAVESH | JAIN | 65500 | PUNE | FMW | 2 |
2003 | RUCHIKA | JAIN | 50.000 | MUMBAI | TESTE | 4 |
3001 | PRANOTI | SHENDE | 55500 | PUNE | JAVA | 3 |
3002 | ANUJA | QUERER | 50500 | JAIPUR | FMW | 2 |
3003 | DEEPAM | JAUHARI | 58500 | MUMBAI | JAVA | 3 |
4001 | RAJESH | GOUD | 60500 | MUMBAI | TESTE | 4 |
4002 | ASHWINI | BOLSA | 54500 | NOIDA | JAVA | 3 |
4003 | PURVA | DHANDEKAR | 57.000 | PUNE | TESTE | 4 |
5001 | ASHWIN | PATEL | 54500 | JAIPUR | JAVA | 3 |