SQL记录-PLSQL事务
PL/SQL事务
数据库事务是一个工作的原子单元,其可以由一个或多个相关的SQL语句组成。所谓的原子性就是数据库的修改所带来的构成事务的SQL语句可以集体被提交,即永久到数据库或从数据库中(撤消)回滚。
一个成功执行的SQL语句和提交的事务不一样。即使一个SQL语句执行成功,除非包含该语句的事务被提交,但也可以回滚和声明(S)的所有更改可以撤消。
开始/结束事务
事务都有开始和结束。事务开始时有下列事件之一:
-
连接到数据库后执行的第一个SQL语句。
-
在事务完成之后发出每一个新的SQL语句完成。
事务结束时的下列事件之一发生:
-
COMMIT或发出ROLLBACK语句。
-
DDL语句,如CREATE TABLE语句,则发出;因为在这种情况下,COMMIT被自动执行。
-
一个DCL语句,比如一个GRANT语句发出; 因为在这种情况下,COMMIT被自动执行。
-
用户从数据库断开。
-
从SQL* PLUS用户退出通过发出EXIT指令,COMMIT自动执行。
-
SQL* Plus异常终止,自动执行ROLLBACK。
-
一个DML语句失败; 在这种情况下自动执行撤消DML语句ROLLBACK。
提交事务
事务是通过发出SQL命令COMMIT永久生效。COMMIT命令的一般语法是:
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 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
COMMIT;
回滚事务
对数据库所做的不提交更改可以使用ROLLBACK命令撤消。
ROLLBACK命令的一般语法是:
ROLLBACK [TO SAVEPOINT < saveyiibai_name>];
当一个事务因一些前所未有的情况中止,如系统故障,则整个事务由于提交自动回滚。如果不使用保存点,然后简单地使用下面的语句来回滚所有的变化:
ROLLBACK;
保存点
保存点是某种标志,帮助分裂一个长事务分成更小的单位设置了一些检查点。由一个长事务中设置保存点,可以根据需要回滚到一个检查点。这是通过发出SAVEPOINT命令来完成。
保存点命令的一般语法是:
SAVEPOINT < saveyiibai_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;
在这里,ROLLBACK TO sav1; 声明回滚变化到一点,在那里标志着保存点sav1,之后将开始新的变化。
自动事务控制
要执行一个自动COMMIT在每一个INSERT,UPDATE或DELETE命令执行时,可以设置AUTOCOMMIT环境变量:
SET AUTOCOMMIT ON;
可以关闭使用以下命令自动提交模式:
SET AUTOCOMMIT OFF;