📜  oracle 回滚 - SQL (1)

📅  最后修改于: 2023-12-03 15:33:19.757000             🧑  作者: Mango

Oracle 回滚 - SQL

在 Oracle 数据库中,当一个事务执行时,如果其中任何一个语句执行失败或者出现异常,那么整个事务就会被回滚到事务开始执行的状态,这个过程称为回滚。

自动回滚

当一个事务执行时,若出现异常,则会自动回滚。

例如:

BEGIN
  INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id) 
  VALUES (207, 'John', 'Doe', 'jdoe@example.com', '01-JAN-21', 'IT_PROG');
  
  UPDATE employees SET salary = salary * 1.1 WHERE employee_id = 207; --语法错误
  
  COMMIT;
END;

在以上例子中,当执行到 UPDATE 语句时因为语法错误,会抛出异常并自动回滚,因此 INSERT 语句也不会被执行。

手动回滚

有时我们需要手动回滚一个事务。

例如:

BEGIN
  SAVEPOINT sp_1;
  INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id) 
  VALUES (208, 'Jane', 'Doe', 'jane@example.com', '01-APR-21', 'IT_PROG');
  
  SAVEPOINT sp_2;
  INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id) 
  VALUES (209, 'Bob', 'Johnson', 'bjohnson@example.com', '01-JUL-21', 'HR_REP');
  
  ROLLBACK TO sp_1; 
  COMMIT;
END;

在以上例子中,我们先创建了一个保存点 SAVEPOINT sp_1,再执行了两个 INSERT 语句,并且在第二个 INSERT 语句前又创建了一个保存点 SAVEPOINT sp_2

在最后,我们使用了 ROLLBACK TO sp_1 将事务回滚到保存点 sp_1 的状态,因此第二个 INSERT 语句和之后的语句都不会被执行,只有第一个 INSERT 语句被提交了。

总结

当一个事务执行时,如果任何一个语句执行失败或者出现异常,它会自动回滚。我们也可以手动创建保存点并执行回滚操作。这些功能让开发者有更多的控制权来管理事务的状态,从而保证每个事务可靠地执行。