开始/结束事务
事务都有开始和结束。事务开始时有下列事件之一:
- 连接到数据库后执行的第一个SQL语句。
- 在事务完成之后发出每一个新的SQL语句完成。
事务结束时的下列事件之一发生:
- COMMIT或发出ROLLBACK语句。
- DDL语句,如CREATE TABLE语句,则发出;因为在这种情况下,COMMIT被自动执行。
- 一个DCL语句,比如一个GRANT语句发出; 因为在这种情况下,COMMIT被自动执行。
- 用户从数据库断开。
- 从SQL* PLUS用户退出通过发出EXIT指令,COMMIT自动执行。
- SQL* Plus异常终止,自动执行ROLLBACK。
- 一个DML语句失败; 在这种情况下自动执行撤消DML语句ROLLBACK。
当执行一组 SQL 语句的时候,Oracle默认帮我们开启一个事务。我们也可以通过 SET TRANSACTION 语句手动开启一个事务。
Oracle默认的隔离级别是read committed。
提交事务
COMMIT;
【示例】
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
COMMIT;
回滚事务
ROLLBACK命令的一般语法是:
ROLLBACK [TO SAVEPOINT <savepoint_name>];
- 使用TO SAVEPOINT参数可以回滚到指定的回滚点
- 直接ROLLBACK则整个事务都会回滚
保存点
保存点是某种标志,帮助分裂一个长事务分成更小的单位,并设置了一些检查点。在一个长事务中设置保存点,可以根据需要回滚到一个检查点。
保存点命令的一般语法是:
SAVEPOINT <savepoint_name>;
【示例】
INSERT INTO customers(id,name,age,address,salary)
VALUES (7, 'Rajnish', 27, 'HP', 9500.00 );
INSERT INTO customers(id,name,age,address,salary)
VALUES (8, 'Riddhi', 21, 'WB', 4500.00 );
SAVEPOINT sav1;
UPDATE customers SET salary = salary + 1000;
ROLLBACK TO sav1;
UPDATE customers SET salary = salary + 1000 WHERE id = 7;
UPDATE customers SET salary = salary + 1000 WHERE id = 8;
COMMIT;
自动事务控制
①自动开启事务
SET TRANSACTION [事务类型|ISOLATION LEVEL 事务隔离级别] NAME 事务名称;
- 事务类型有:READ WRITE(读写事务)、READ ONLY(只读事务)
【示例】
BEGIN
-- 手动开启事务 tran
SET TRANSACTION NAME 'tran';
--SET TRANSACTION READ WRITE NAME 'tran'; -- 这条语句和上面的语句完全相同,表明它是一个读写事务
INSERT INTO TEST VALUES ('Scott');
-- 提交事务
COMMIT;
END;
/
②自动执行事务提交
要在每一个insert,update或detele命令执行后自动执行commit,可以设置autocommit环境变量:
#on为打开自动commit,off为关闭自动commit
set autocommit on;