`

orcale临时表与锁的创建

阅读更多


近来用到了oracle的临时表和锁,所以在这里简单总结一下。
加锁主要是为了防并发,临时表也可以用于防并发。

关于oracle的锁详细用法可以参见这个博客:
http://book.51cto.com/art/200806/75658.htm

加锁sql  ---lock table maintms_locktable in exclusive mode--这是表级锁
 
对表用了独占模式。可根据需要用不同的模式。对表,行,或者字段。

select * from table for update  这是行级锁。

create table maintms_locktable (mainid varchar2(30));

insert into maintms_locktable values('maintmstable');


select * from maintms_locktable --for update

可用sql建表去做简单比较。

----查看锁表进程SQL语句1:
select sess.sid,
    sess.serial#,
    lo.oracle_username,
    lo.os_user_name,
    ao.object_name,
    lo.locked_mode
    from v$locked_object lo,
    dba_objects ao,
    v$session sess
where ao.object_id = lo.object_id and lo.session_id = sess.sid;

----杀掉锁表进程:

alter   system     kill   session   'sid,serial#';

----如有记录则表示有lock,记录下SID和serial# ,将二者连接起来,就可以kill。如下:
alter system kill session '887,1672';

oracle有两种级别的临时表,会话级和事务级。
--------会话级临时表--------------
create global temporary table temp_tbl(col_a varchar2(30)) on commit preserve rows

insert into temp_tbl values('test session table')

    select *from temp_tbl2

---------事务级临时表-----------

Create Global Temporary Table Table_Name

(Col1 Type1,Col2 Type2...) On Commit Delete Rows ;



== 两中类型临时表的区别

会话级临时表采用 on commit preserve rows ;而事务级则采用 on commit delete rows ;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是 commit 、 rollback 或者是会话结束,Oracle临时表中的数据都将被截断

==什么时候使用临时表

1 当某一个 SQL 语句关联的表在 2 张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中

2 程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。


==临时表的不足之处

1 不支持 lob 对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。

2 不支持主外键关系

所以,由于以上原因,我们可以自己创建Oracle临时表,以弥补 Oracle 临时表的不足之处

上面的都是本人经过测试的,但下面是在网上搜索到的方法,本人具体没有测试过,不过觉得可行性很强,有时间测试下

创建方法:

1 、以常规表的形式创建临时数据表的表结构,但要在每一个表的主键中加入一个 SessionID <NUMBER> 列以区分不同的会话。(可以有 lob 列和主外键)

2 、写一个用户注销触发器,在用户结束会话的时候删除本次会话所插入的所有记录 (SessionID 等于本次会话 ID 的记录 ) 。

3 、程序写入数据时,要顺便将当前的会话 ID(SessionID) 写入表中。

4 、程序读取数据时,只读取与当前会话 ID 相同的记录即可。

功能增强的扩展设计:

1 、可以在数据表上建立一个视图,视图对记录的筛选条件就是当前会话的SessionID 。

2 、数据表中的SessionID 列可以通过Trigger 实现,以实现对应用层的透明性。

3 、高级用户可以访问全局数据,以实现更加复杂的功能。

扩展临时表的优点:

1 、实现了与Oracle 的基于会话的Oracle临时表相同的功能。

2 、支持SDO_GEOMETRY 等lob 数据类型。

3 、支持表间的主外键连接,且主外键连接也是基于会话的。

4 、高级用户可以访问全局数据,以实现更加复杂的功能


分享到:
评论

相关推荐

    oracle临时表(事务级、会话级).docx

    SQL Server 临时表与 Oracle 临时表类似,但有所不同。SQL Server 临时表可以分为两种:本地临时表和全局临时表。 本地临时表 本地临时表以单个数字符号 (#) 打头,仅对当前的用户连接是可见的。当用户从 SQL ...

    oracle临时表操作学习资料

    默认情况下,如果没有明确指定,Oracle将创建的临时表视为事务临时表。为清晰起见,建议使用`ON COMMIT DELETE ROWS`关键字来标识事务临时表。 - **数据变化**:在事务临时表中插入的数据仅在当前事务内有效。事务...

    OracleTemporaryTables(Oracle临时表).docx

    Oracle Temporary Tables,也称为Oracle临时表,是Oracle数据库系统中用于存储临时数据的特殊类型表。它们主要用于处理会话级别的数据,这些数据在特定会话或事务结束后会被自动清理,从而减少了对永久表的负担和...

    OracleTemporaryTables(Oracle临时表).pdf

    Oracle Temporary Tables,也称为Oracle临时表,是在Oracle数据库中用于临时存储数据的特殊表。它们主要用在处理大型数据集时提高性能,特别是在复杂的查询和存储过程中。临时表的生命周期和可见性根据创建时指定的...

    Oracle锁和表分区

    临时表可以创建索引、视图和触发器,但不能建立外键。 了解并熟练掌握锁和表分区的概念及其应用,对于优化Oracle数据库的性能和确保数据一致性至关重要。在实际操作中,根据业务需求合理使用这些机制,能够显著提升...

    oracle,sql临时表.pdf

    临时表的一个关键特性是其数据的私有性,每个Session只能看到并修改自己的临时数据,无法访问其他Session的临时表数据,因此无需DML锁。 2. **详细介绍** 创建全局临时表(CREATE GLOBAL TEMPORARY TABLE)是定义...

    oracle 临时表详解及实例

    Oracle8i及更高版本支持临时表的创建和使用,提供了两种类型:会话特有的临时表和事务特有的临时表。 会话特有的临时表通过`ON COMMIT PRESERVE ROWS`语句创建。这种类型的临时表在会话期间保持其数据,即使事务...

    oracle创建用户详细流程

    与普通表空间不同,临时表空间中的数据在会话结束时会被自动清除。 **命令示例:** ```sql CREATE TEMPORARY TABLESPACE yu_temp TEMPFILE 'D:\app\Administrator\product\bakup\yu_temp.dbf' SIZE 32M AUTOEXTEND...

    Oracle在线建立超大表的索引

    3. **RC**:索引键排序,如果内存中无法容纳所有的数据,则会在磁盘上进行分段排序,涉及到临时表空间的写I/O。 4. **RD**:写入INDEX DB BLOCK的I/O。 5. **RE**:更改INDEX DB BLOCK产生的REDO I/O。 #### 最小化...

    怎样快速查出Oracle 数据库中的锁等待

    1. **创建临时表**:以DBA权限创建三个临时表`my_session`、`my_lock`和`my_sqltext`,并为其关键字段建立索引。 - `my_session`:存储会话相关信息。 - `my_lock`:存储锁相关信息。 - `my_sqltext`:存储SQL...

    Oracle 表空间建立方法

    用户创建后也可以通过`ALTER USER`命令来更改用户的默认表空间和临时表空间。 ```sql ALTER USER username DEFAULT TABLESPACE user_tablespace TEMPORARY TABLESPACE temp_tablespace; ``` #### 四、创建表空间 ...

    oracle 检测数据库是否有对象被锁的脚本

    2. 创建一个临时表或视图来存储第一次运行时的锁定信息。 3. 第二次运行时,通过JOIN操作比较临时表和`V$LOCKED_OBJECT`视图,找出持续存在的锁。 4. 如果找到匹配的锁,脚本将打印出相关信息,或者触发一个警告通知...

    oracle创建表空间用户和赋权限

    - `TEMPORARY TABLESPACE "TEMP"`:设置用户的临时表空间为`TEMP`。 - `ACCOUNT UNLOCK`:解锁账户,使用户可以立即登录。 #### 三、授予权限 在创建了用户后,通常还需要为其分配权限,以便用户可以访问数据库中...

    手工创建Oracle数据库过程详解

    5. 接下来的几步主要是配置参数,如默认表空间、数据文件位置、临时表空间等,可以根据需求进行自定义。 6. 设置统一的系统管理员口令,例如“JIAjia1027”。 7. 完成其他配置,如内存参数、归档模式等。 8. 最后...

    Oracle日常维护故障定位故障排除

    3. 临时表空间无法扩展:临时表空间满时,数据库操作可能暂停。确保有足够的磁盘空间,并合理设置临时表空间的自动扩展属性。 二、数据库功能/性能异常 4. RMAN备份挂起:未及时打补丁可能导致RMAN备份过程中出现...

    oracle 解锁 语句

    - 查询临时表空间使用情况: ```sql SQL&gt; SELECT TABLESPACE_NAME, FILE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS FROM DBA_TEMP_FILES; ``` 此外,还可以通过检查`V$ROLLNAME`和`V$SESSION`视图来了解...

    Oracle创建用户,并授权DBA权限

    接下来创建用户 remotesea,并为其分配默认表空间及临时表空间等属性: ```sql CREATE USER remotesea IDENTIFIED BY duns PROFILE DEFAULT DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP ACCOUNT UNLOCK; `...

    创建Oracle表空间,能够执行的代码

    - `TEMPORARY TABLESPACE TEMP`: 临时表空间为“TEMP”。 - `ACCOUNT UNLOCK`: 用户账户处于解锁状态。 **示例代码(创建另一个用户):** ```sql CREATE USER fts20101127basic BASIC PROFILE DEFAULT ...

Global site tag (gtag.js) - Google Analytics