Oracle DB处理数据(四)

2014-11-24 14:40:43 · 作者: · 浏览: 3
it(退出)”,可以正常退出会话。在SQL*Plus 中,在提示符下键入EXIT命令可以正常退出。关闭窗口则被解释为异常退出。
执行COMMIT或ROLLBACK操作之前的数据状态
可以将数据还原到以前的状态。
当前用户可以使用SELECT语句查看DML 操作的结果。
其他用户不能查看当前用户发出的DML 语句的结果。
受影响行已锁定,其他用户不能更改受影响行中的数据。
在提交事务处理之前,其间进行的所有数据更改都是临时的。
发出COMMIT或ROLLBACK语句之前数据的状态如下所述:
数据处理操作主要影响数据库缓冲区,因此可以将数据还原到以前的状态。
当前用户可以通过对表进行查询来查看数据处理操作的结果。
其他用户不能查看当前用户执行的数据处理操作的结果。Oracle Server 会建立读一致性,从而确保每个用户看到的数据都是上次提交时的数据。
受影响行已锁定,其他用户不能更改受影响行中的数据。
执行COMMIT操作之后的数据状态
数据更改已保存在数据库中。
已改写以前的数据状态。
所有用户都可以查看结果。
受影响行上的锁已被释放,其他用户可以对这些行进行处理。
所有保存点都已被清除。
使用COMMIT语句可以使所有待定更改变成永久性更改。执行COMMIT语句之后会发生以下情况:
数据更改已写入数据库中。
以前的数据状态不再适用于正常的SQL 查询。
所有用户都可以查看事务处理的结果。
受影响行上的锁已被释放,其他用户可以对这些行执行新的数据更改。
所有保存点都已被清除。
提交数据
进行更改:
DELETE FROM employees WHERE employee_id = 99999;
INSERT INTO departments VALUES (290, 'Corporate Tax', NULL, 1700);
提交更改:
COMMIT;
在示例中,从EMPLOYEES表中删除了一行并向DEPARTMENTS表中添加了新行。
通过发出COMMIT语句已保存所做的更改。
示例:
删除DEPARTMENTS表中的部门290 和300 并更新EMPLOYEES表中的一行。保存数据更改。
DELETE FROM departments WHERE department_id IN (290, 300);
UPDATE employees SET department_id = 80 WHERE employee_id = 206;
COMMIT;
执行ROLLBACK操作之后的数据状态
使用ROLLBACK语句放弃所有待定更改之后会有如下结果:
数据更改已取消。
数据已还原到以前的状态。
受影响行上的锁已被释放。
DELETE FROM copy_emp;
ROLLBACK;
执行ROLLBACK操作之后的数据状态:示例
DELETE FROM test;
25,000 rows deleted.
ROLLBACK;
Rollback complete.
DELETE FROM test WHERE id = 100;
1 row deleted.
SELECT * FROM test WHERE id = 100;
No rows selected.
COMMIT;
Commit complete.
在试图从TEST表中删除一条记录时,可能会意外地清空该表。但是,可以更正该错误,然后重新发出适当的语句,使数据更改变成永久性更改。
语句级回退
如果在执行期间单个DML 语句失败,则只会回退该语句。
Oracle Server 会实施一个隐式保存点。
保留其它所有更改。
用户应通过执行COMMIT或ROLLBACK语句显式终止事务处理。
如果检测到语句执行错误,则可以通过隐式回退来放弃事务处理的一部分。如果执行事务处理期间单个DML 语句失败,则可使用语句级回退来取消其影响,但不放弃事务处理中前面的DML 语句所做的更改。用户可以显式地提交或回退这些DML 语句。
Oracle Server 会在任意DDL 语句之前和之后发出隐式提交。因此,即使DDL 语句未成功执行,你也不能回退前面的语句,因为服务器已发出提交。
通过执行COMMIT或ROLLBACK语句可以显式终止事务处理。
读一致性
读一致性可以确保用户所看到的数据始终是一致的。
一个用户进行的更改不会与另一个用户进行的更改相冲突。
读一致性可以确保对于同一数据:
– 读取者不必等待写入者完成操作即可读取
– 写入者不必等待读取者完成操作即可写入
– 写入者必须等待其他写入者完成操作才可写入
数据库用户可通过以下两种方式访问数据库:
读取操作(SELECT语句)。
写入操作(INSERT、UPDATE、DELETE语句)。
你需要使用读一致性来确保达到如下效果:
保证数据库读取者和写入者看到的数据是一致的。
读取者看不到正在更改的数据。
保证写入者对数据库的更改是在一致方式下完成的。
一个写入者进行的更改不会中断另一个写入者正在进行的更改,也不会与之相冲突。
建立读一致性的目的是为了确保每个用户看到的都是在DML 操作开始之前上次提交的数据。
注:同一用户可以登录不同的会话。每个会话均以上述方式维护读一致性,即使这些会话是同一用户的会话也如此。
实施读一致性
读一致性是自动实现的。它在还原段中保留一个部分数据库的副本。读一致性映像由表中的已提交数据和还原段中正在更改且尚未提交的旧数据组成。
在对数据库执行插入、更新或删除操作时,Oracle Server 会在数据发生更改之前创建它的副本,并将其写入到还原段中。
除进行更改的人员之外,所有读取者看到的仍是更改开始之前的数据库,他们看到的是还原段的数据“快照”。
在将更改提交到数据库之前,只有正在修改数据的用户可以看到数据库中的更改内容。
其他所有人看到的都是还原段中的快照。这样可以保证数据读取者能读取到一致的数据,而不是当前正在进行更改的数据。
提交DML 语句之后,任何发出SELECT语句的用户都可以看到对数据库所做的更改。
还原段文件中旧数据占用的空间已被释放出来,可供重新使用。
如果回退事务处理,则会取消这些更改:
还原段中原始的旧版本数据已写回到表中。
所有用户看到的都是事务处理开始之前的数据库。
SELECT语句中的FOR UPDATE子句
锁定EMPLOYEES表中job_id为SA_REP的行。
SELECT employee_id, salary, commission_pct, job_id FROM employees WHERE job_id = 'SA_REP'