- 浏览: 275480 次
- 性别:
- 来自: 福建
文章分类
- 全部博客 (98)
- jQuery (13)
- Ext (1)
- javascript (30)
- SSH项目 (5)
- webservice (1)
- struts2 (1)
- 其它 (7)
- hibernate (7)
- Oracle (19)
- 常用资料 (7)
- 全屏浏览器 (2)
- Linux (1)
- weblogic (3)
- java web打包安装程序 (1)
- 解决讨厌的Oracle死锁 (1)
- jxl 实现根据sql语句导出excel文件 (1)
- Java中使用的路径 (1)
- 存储过程锁问题 存储过程编译锁问题---解锁办法 (0)
- 存储过程锁问题、锁表问题 存储过程编译锁问题---解锁办法 (1)
- Oracle、导出序列 (1)
- java 抓取网页图片 (1)
最新评论
-
guoshuai_27:
...
24种页面切换效果详解 -
nucleus:
第一个例子少了sql demo1:统计某商店的营业额能补上去么 ...
超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数 -
agan112:
xili
oracle数组例子 -
ye361571404:
谢谢了。。。。
weblogic92启动时的问题:Unmarshaller failed . -
bianxiaoxm:
感觉不错,值得学习!
js禁止页面刷新后退
4,事务处理
Oracle是基于事务的,oracle以用户事务来确保数据的完整性。一个事务就是将一系列的数据操纵的sql语句作为一个逻辑单元,逻辑单元里面的单个操作要么全做,要么全部不做,以保证数据的完整性。
事务结束时将产生数据库的更改,oracle使用undo来记录所有的更改,如果程序在事务未完成之前发生了错误,oracle将会检测到这个错误,并回滚当前的事务,撤销从事务开始时的更改。保存点(savepoint)标记了当前事务处理的一个状态点,结合使用rollback,savepoint可以撤销部分事务,使用set transaction可以设置事务的属性,比如读写访问和隔离级别。
事务隔离级别
SQL92定义了四种事务隔离级别(transaction isolation level),主要是为了在并发事务执行时阻止下列现象发生:
脏读:事务读取了被其他事务写入但未提交的数据。
不可重复读:一个事务再次读取其之前曾经读取过的数据时,发现数据已被其他已提交的事务修改或删除。
幻象读(phantom read):事务按照之前的条件重新查询时,返回的结果集中包含其他已提交事务插入的满足条件的新数据。
提供的四种隔离级别分别不同程度的对这三种现象做了限制:
隔离级别 |
脏读 |
不可重复读 |
幻象读 |
未提交读取 (read uncommitted) |
允许 |
允许 |
允许 |
已提交读取 (read committed) |
不允许 |
允许 |
允许 |
可重复读取 (repeatable read) |
不允许 |
不允许 |
允许 |
串行化 (serializable) |
不允许 |
不允许 |
不允许 |
Oracle支持三种事务隔离级别,分别是
已提交读取,串行化,只读(read only),默认的事务隔离级别是已提交读取。
Oracle事务隔离级别 |
脏读 |
不可重复读 |
幻象读 |
事务内使用 DML操作数据 |
Read committed 已提交读取 |
不允许 |
允许 |
允许 |
允许 |
Serializable 串行化 |
不允许 |
不允许 |
不允许 |
允许 |
Read only 只读 |
不允许 |
不允许 |
不允许 |
不允许 |
Oracle允许在事务开始时使用语句来设定事务的级别,以下三个语句分别设定oracle的三种事务隔离级别:
set transaction isolation level read committed;
set transaction isolation level serializable;
set transaction read only;
Plsql事务处理的语句有下列一些:
Commit, rollback, savepoint, rollback to savepoint, set transaction ,lock table等。
例如:
Set transaction read only
这个语句建立一个事务级的读一致性,事务内所有的查询所见的都是事务开始之前的改变,只读事务对于表有修改的许多查询报表来说比较有用。这个语句不适用于SYS用户,意味着,即使SYS用户设置事务为只读,查询也会返回事务期间的更改。
测试:
Scott用户下:
Session1:
SQL> set transaction read only;
Transaction set
SQL> select sum(sal) from scott.emp ;
SUM(SAL)
----------
28124.2
Session2:
SQL> update scott.emp a set a.sal = a.sal + 1.1;
14 rows updated
SQL> commit;
Commit complete
Session1:
SQL> select sum(sal) from scott.emp ;
SUM(SAL)
----------
28124.2
SQL> commit;
Commit complete
SQL> select sum(sal) from scott.emp ;
SUM(SAL)
----------
28139.6
很容易看出set transaction read only的效果,如果实在sys下面,情况则是这样的:
Session1:
SQL> set transaction read only;
Transaction set
SQL> select sum(sal) from scott.emp ;
SUM(SAL)
----------
28139.6
Session2:
SQL> update scott.emp a set a.sal = a.sal + 1.1;
14 rows updated
SQL> commit;
Commit complete
SQL>
Session1:
SQL> select sum(sal) from scott.emp ;
SUM(SAL)
----------
28155
在plsql中使用set transaction read only需要在事务开始之前提交或者回滚,结束后也一般需要提交或者回滚例如:
declare
v_sum_sal scott.emp.sal%type;
begin
rollback work;
set transaction read only;
select sum(sal) into v_sum_sal from scott.emp;
dbms_output.put_line(v_sum_sal);
commit;
end;
/
事实上,这是由于使用set transaction read only以后,就会有一个事务产生:
SQL> set transaction read only;
Transaction set
SQL> select a.XIDUSN, a.UBAREC, a.UBABLK, a.USED_UBLK, a.USED_UREC from v$transaction a;
XIDUSN UBAREC UBABLK USED_UBLK USED_UREC
---------- ---------- ---------- ---------- ----------
2 0 0 1 1
SQL> commit;
Commit complete
SQL> select a.XIDUSN, a.UBAREC, a.UBABLK, a.USED_UBLK, a.USED_UREC from v$transaction a;
XIDUSN UBAREC UBABLK USED_UBLK USED_UREC
---------- ---------- ---------- ---------- ----------
Set transaction read write
再来看看:
Savepoint ,rollback to savepoint,commit
下面这段代码很容易看出这几个语句的使用方式和效果
SQL> set serveroutput on;
declare v_sal scott.emp.sal%type; begin savepoint sp_1; update scott.emp a set a.sal = a.sal + 1 where a.empno = 7369; select sal into v_sal from scott.emp a where a.empno = 7369; dbms_output.put_line(v_sal); savepoint sp_2; update scott.emp a set a.sal = a.sal + 1 where a.empno = 7369; rollback to sp_2; commit; select sal into v_sal from scott.emp a where a.empno = 7369; dbms_output.put_line(v_sal); end; 16 /
810.6
810.6
PL/SQL procedure successfully completed
再看看lock table的几种方式:
Lock table in
ROW SHARE
ROW EXCLUSIVE
SHARE UPDATE
SHARE
SHARE ROW EXCLUSIVE
EXCLUSIVE
[nowait]
可以简单看看各种类型锁定的情况,结合nowait参数来看看lmode和ctime的变化。
示例share mode和row exclusive mode:
SQL> lock table scott.emp in share mode nowait;
Table(s) locked
SQL> select sid from v$mystat a where rownum = 1;
SID
----------
150
SQL> select * from v$lock a where a.SID = 150;
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
41DC66F4 41DC670C 150 TM 51564 0 4 0 45 0
41E10938 41E1095C 150 TX 458775 3256 6 0 45 0
SQL> rollback;
Rollback complete
SQL> lock table scott.emp in row exclusive mode nowait;
Table(s) locked
SQL> select * from v$lock a where a.SID = 150;
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
41DC66F4 41DC670C 150 TM 51564 0 3 0 6 0
41E10938 41E1095C 150 TX 65558 3276 6 0 6 0
SQL> commit;
Commit complete
发表评论
-
oracle 表delete 通过闪回功能恢复数据
2012-12-24 15:29 1307第一步:确定删除时间点,找出SCN,后面需要根据SCN让 ... -
获取ORACLE 表字段,表名,以及主键之类等等的信息。
2012-09-29 09:27 4415获取表名: Oracle的user_talbes用于记录了 ... -
存储过程锁问题、锁表问题 存储过程编译锁问题---解锁办法,Oracle
2012-01-10 17:09 6255存储过程锁问题 存储过程编译锁问题---解锁办法 /* ... -
解决讨厌的Oracle死锁
2011-11-14 17:27 1331--第一步:查看是否有死锁存在,查出有数据则代表有死锁 ... -
Oracle左右全连接总结
2011-05-10 09:10 1098--建立测试数据 create table a(id ... -
超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数
2011-04-19 14:37 20070超级牛皮的oracle的分析函数over(Partition ... -
平时积累的一些SQL语句(转) 2
2011-02-22 09:11 1518FORM中获取光标所在的TAB页面 1. 在Form级触发器 ... -
平时积累的一些SQL语句(转) 1
2011-02-22 09:08 1393/* Formatted on 2011-1-12 10:48 ... -
plsql异常处理
2010-12-08 10:30 1406一、异常 (1) 程序错误 - 编译时 ... -
plsql事务处理(二)
2010-12-08 10:25 1427自治事务 看看在oracle中一个事务调用另外一个事务的情况 ... -
oracle自动备份、Oracle远程备份
2009-11-12 15:42 17341.在tnsnames.ora添加要远程备份的主机 如: ... -
Oracle临时表学习
2009-09-18 10:20 1033CREATE GLOBAL TEMPORARY TABLE ... -
Oracle临时表的使用2
2009-09-17 16:06 1410Temp Table 的特点: (1) 多用户操作的独立性: ... -
Oracle临时表的使用1
2009-09-17 16:00 19541。会话特有的临时表 ... -
exists 和 in 小结
2009-09-17 15:12 12301.用EXISTS替代IN 在许多 ... -
oracle数组例子
2009-09-16 14:52 18085--固定数组 declare type type_ar ... -
Oracle数组学习--01
2009-09-11 16:37 1958COUNT 返回集合中元素的个数 ... -
pl/sql一些常用小例子
2009-09-10 10:22 1294游标: 隐式游标:sql%found,sql%notfoun ...
相关推荐
异常处理是PLSQL中的一个重要部分,用于捕获和处理运行时错误。使用BEGIN...EXCEPTION...END块,可以定义在遇到特定错误时的处理方式。例如,使用WHEN语句捕获特定的SQLCODE或SQLERRM,或者使用WHENEVER语句进行...
PLSQL 是一种高性能的基于事务处理的语言,能运行在任何 ORACLE 环境中,支持所有数据处理命令。通过使用 PLSQL 程序单元处理 SQL 的数据定义和数据控制元素。 PLSQL 支持所有 SQL 数据类型和所有 SQL 函数,同时...
- **事务管理**:PLSQL支持事务的开始、提交、回滚,确保数据的一致性。 学习PLSQL,你需要理解其语法特性,如如何声明和初始化变量,如何编写过程和函数,如何处理异常,以及如何利用控制结构进行流程控制。此外,...
PLSQL(Procedural Language/Structured Query Language)是Oracle数据库专用的一种编程语言,它结合了SQL的查询功能和过程性编程语言的特点,主要用于管理和操作Oracle数据库。Oracle数据库是一款广泛应用于企业级...
### PLSQL中记录被另一个用户锁住的原因及处理方法 #### 背景与概念 在数据库管理系统(DBMS)中,多个用户或应用程序可能同时访问相同的数据资源。为了确保数据的一致性和完整性,数据库系统通常会采用锁机制来...
PLSQL(Procedural Language/Structured Query Language)是Oracle数据库中的一个强大编程工具,它将SQL语句与过程式编程语言结合在一起,为数据库管理提供了更丰富的功能。本主题“PLSQL高级编程-结构化编程”主要...
PLSQL(Procedural Language/Structured Query Language)是Oracle数据库中的一个强大工具,它结合了SQL的查询功能和过程性编程语言的特点,使得数据库管理、数据处理和应用程序开发更为便捷。"PLSQL Developer"是一...
此外,了解如何管理和优化PLSQL代码也很重要,包括索引的使用、游标的管理、事务控制和批量处理等。对于大型企业级应用,PLSQL还常常与Oracle的其他高级特性如分区、物质化视图、物化 join 和并行执行等结合使用,以...
PLSQL提供了一个强大的异常处理机制,允许我们预定义或自定义异常,并在发生错误时进行相应的处理。异常处理通常由BEGIN...EXCEPTION WHEN...END结构实现,其中WHEN子句可以捕获特定类型的异常并执行相应的恢复逻辑...
8. **脚本执行**:可以一次性执行多条SQL或PLSQL语句,方便日常维护和数据处理。 通过PLSQL Developer,开发人员可以更加便捷地编写、测试和管理PLSQL代码,提升数据库应用程序的开发效率和质量。对于熟悉PLSQL的...
它扩展了SQL,允许开发者编写存储过程、函数、包、触发器等,提供了更强大的数据处理能力和事务控制功能。在64位操作系统环境下,PLSQL的64位版本能更好地利用系统的硬件资源,处理大数据量和复杂计算,为大型企业级...
- **事务处理**:通过BEGIN、COMMIT和ROLLBACK语句,可以确保一组操作的原子性,即使在发生错误时也能保证数据的一致性。 - **异常处理**:通过EXCEPTION部分,可以捕获和处理运行时错误,提高程序的健壮性。 - **...
它允许SQL的数据操纵语言和查询语句包含在块结构(block_structured)和代码过程语言中,使PL/SQL成为一个功能强大的事务处理语言。在甲骨文数据库管理方面,PL/SQL是对结构化查询语言(SQL)的过程语言扩展。PL/SQL的...
9. **PLSQL的事务管理**:可以使用BEGIN TRANSACTION、COMMIT、ROLLBACK等语句进行事务的开始、提交和回滚,确保数据的一致性。 10. **PLSQL的性能优化**:通过索引、存储优化、批量处理、减少网络往返等方法,可以...
在使用PLSQL Developer时,用户可能还需要了解Oracle的体系结构,包括表空间、用户、权限等概念,以及如何通过PL/SQL语法进行数据操作和事务管理。对于更高级的用法,如性能优化、存储过程的并发控制和异常处理,也...
InstantClient包含了必要的库文件,使得PLSQL Developer可以远程连接到Oracle数据库,进行数据查询、更新、事务处理等操作。 PLSQL Developer的主要功能包括: 1. **代码编辑器**:提供语法高亮、自动完成、错误...
12. **事务管理**:PLSQL支持事务的概念,包括COMMIT、ROLLBACK和SAVEPOINT操作,确保数据的完整性和一致性。 13. **并发控制**:PLSQL提供了锁定机制来处理多个用户同时访问同一数据的情况,如SELECT...FOR UPDATE...
异常处理是PLSQL的一个重要特性,通过EXCEPTION关键字,你可以捕获并处理运行时可能出现的错误,例如SQL错误、逻辑错误或自定义异常,从而增加程序的健壮性。 最后,PLSQL还支持与Oracle数据库的其他高级特性交互,...
学习PLSQL,你需要掌握如何声明和使用变量、处理流程控制(如循环、条件语句)、编写存储过程和函数、处理数据库事务、理解和使用异常处理机制,以及如何与其他数据库对象(如表、视图和索引)交互。同时,熟悉...
在PLSQL中,你可以创建一系列的程序逻辑,如循环、条件判断、异常处理等,这些在单纯的SQL语句中通常是无法实现的。PLSQL的结构包括声明部分、执行部分和异常处理部分,这使得开发者可以构建复杂的业务逻辑。 ...