PL / SQL事务
数据库事务工作的基本单位,可能会由一个或多个相关的SQL语句。这就是所谓的原子弹,因为数据库修改所带来的构成一个事务中的SQL语句可以共同被提交,即成为永久性的数据库或轧制从数据库返回的(撤消)。
一个成功执行的SQL语句和提交的事务都不一样。即使成功执行SQL语句,除非包含该语句的事务被提交,它可以回滚,并使用statement(s)的所有修改都可以撤销。
启动一个结束交易
事务有开始和结束 。当下列事件之一发生事务开始:
第一个SQL语句连接到数据库后执行。
在交易后发出的每个新的SQL语句完成。
当下列事件之一发生事务结束:
COMMIT或ROLLBACK语句发出。
DDL语句,如CREATE TABLE语句,已发出;因为在这种情况下,一个将自动执行COMMIT。
一个DCL语句,例如GRANT语句,已发出;因为在这种情况下,一个将自动执行COMMIT。
用户从数据库中断开。
从SQL * Plus用户退出通过发出EXIT指令中,提交自动执行。
在SQL * Plus异常终止,自动执行ROLLBACK。
一个DML语句失败;在这种情况下一个ROLLBACK对于撤销该DML语句自动执行。
提交事务
事务是通过发出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 < savepoint_name>];
当一个事务因中止一些前所未有的情况,如系统故障,则整个事务,因为提交自动回退。如果您不使用保存点 ,然后只需使用下面的语句来回滚所有的变化:
ROLLBACK;
保存点
保存点是排序的标记,通过设置一些关卡拆分长事务分成更小的单位帮助。由一个长事务中保存点的设置,你可以根据需要回滚到一个检查点。这是通过发出SAVEPOINT命令来完成。
对于SAVEPOINT命令的一般语法是:
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;
在这里,ROLLBACK TO sav1;声明回滚变化到这一点,在那里你标志着保存点sav1和新的变化后,将启动。
自动事务控制
要执行一个自动执行COMMIT每当一个INSERT,UPDATE或DELETE命令执行,你可以设置AUTOCOMMIT环境变量:
SET AUTOCOMMIT ON;
您可以关闭自动使用以下命令提交方式:
SET AUTOCOMMIT OFF;