📅  最后修改于: 2023-12-03 15:33:19.757000             🧑  作者: Mango
在 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
语句被提交了。
当一个事务执行时,如果任何一个语句执行失败或者出现异常,它会自动回滚。我们也可以手动创建保存点并执行回滚操作。这些功能让开发者有更多的控制权来管理事务的状态,从而保证每个事务可靠地执行。