`

plsql事务处理(一)

阅读更多

4,事务处理

Oracle是基于事务的,oracle以用户事务来确保数据的完整性。一个事务就是将一系列的数据操纵的sql语句作为一个逻辑单元,逻辑单元里面的单个操作要么全做,要么全部不做,以保证数据的完整性。

事务结束时将产生数据库的更改,oracle使用undo来记录所有的更改,如果程序在事务未完成之前发生了错误,oracle将会检测到这个错误,并回滚当前的事务,撤销从事务开始时的更改。保存点(savepoint)标记了当前事务处理的一个状态点,结合使用rollbacksavepoint可以撤销部分事务,使用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参数来看看lmodectime的变化。

示例share moderow 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

分享到:
评论

相关推荐

    plsql资料--plsql资料

    异常处理是PLSQL中的一个重要部分,用于捕获和处理运行时错误。使用BEGIN...EXCEPTION...END块,可以定义在遇到特定错误时的处理方式。例如,使用WHEN语句捕获特定的SQLCODE或SQLERRM,或者使用WHENEVER语句进行...

    PLSQL简易教程学过以后plsql不愁

    PLSQL 是一种高性能的基于事务处理的语言,能运行在任何 ORACLE 环境中,支持所有数据处理命令。通过使用 PLSQL 程序单元处理 SQL 的数据定义和数据控制元素。 PLSQL 支持所有 SQL 数据类型和所有 SQL 函数,同时...

    PLSQL电子书小合集

    - **事务管理**:PLSQL支持事务的开始、提交、回滚,确保数据的一致性。 学习PLSQL,你需要理解其语法特性,如如何声明和初始化变量,如何编写过程和函数,如何处理异常,以及如何利用控制结构进行流程控制。此外,...

    plsql&&oracle

    PLSQL(Procedural Language/Structured Query Language)是Oracle数据库专用的一种编程语言,它结合了SQL的查询功能和过程性编程语言的特点,主要用于管理和操作Oracle数据库。Oracle数据库是一款广泛应用于企业级...

    PLSQL中记录被另一个用户锁住的原因及处理方法.txt

    ### PLSQL中记录被另一个用户锁住的原因及处理方法 #### 背景与概念 在数据库管理系统(DBMS)中,多个用户或应用程序可能同时访问相同的数据资源。为了确保数据的一致性和完整性,数据库系统通常会采用锁机制来...

    PLSQL高级编程-结构化编程

    PLSQL(Procedural Language/Structured Query Language)是Oracle数据库中的一个强大编程工具,它将SQL语句与过程式编程语言结合在一起,为数据库管理提供了更丰富的功能。本主题“PLSQL高级编程-结构化编程”主要...

    PLSQL 操作学习文档

    PLSQL(Procedural Language/Structured Query Language)是Oracle数据库中的一个强大工具,它结合了SQL的查询功能和过程性编程语言的特点,使得数据库管理、数据处理和应用程序开发更为便捷。"PLSQL Developer"是一...

    PLSQL 11.03.1770

    此外,了解如何管理和优化PLSQL代码也很重要,包括索引的使用、游标的管理、事务控制和批量处理等。对于大型企业级应用,PLSQL还常常与Oracle的其他高级特性如分区、物质化视图、物化 join 和并行执行等结合使用,以...

    PLSQL 个人自学总结

    PLSQL提供了一个强大的异常处理机制,允许我们预定义或自定义异常,并在发生错误时进行相应的处理。异常处理通常由BEGIN...EXCEPTION WHEN...END结构实现,其中WHEN子句可以捕获特定类型的异常并执行相应的恢复逻辑...

    PLSQL 7.0中文版

    8. **脚本执行**:可以一次性执行多条SQL或PLSQL语句,方便日常维护和数据处理。 通过PLSQL Developer,开发人员可以更加便捷地编写、测试和管理PLSQL代码,提升数据库应用程序的开发效率和质量。对于熟悉PLSQL的...

    PLSQL *64

    它扩展了SQL,允许开发者编写存储过程、函数、包、触发器等,提供了更强大的数据处理能力和事务控制功能。在64位操作系统环境下,PLSQL的64位版本能更好地利用系统的硬件资源,处理大数据量和复杂计算,为大型企业级...

    PLSQL中文语言包

    - **事务处理**:通过BEGIN、COMMIT和ROLLBACK语句,可以确保一组操作的原子性,即使在发生错误时也能保证数据的一致性。 - **异常处理**:通过EXCEPTION部分,可以捕获和处理运行时错误,提高程序的健壮性。 - **...

    PLSQL安装包:PLSQL Developer 14.rar

    它允许SQL的数据操纵语言和查询语句包含在块结构(block_structured)和代码过程语言中,使PL/SQL成为一个功能强大的事务处理语言。在甲骨文数据库管理方面,PL/SQL是对结构化查询语言(SQL)的过程语言扩展。PL/SQL的...

    PLSQL.rar_plsql_plsql java

    9. **PLSQL的事务管理**:可以使用BEGIN TRANSACTION、COMMIT、ROLLBACK等语句进行事务的开始、提交和回滚,确保数据的一致性。 10. **PLSQL的性能优化**:通过索引、存储优化、批量处理、减少网络往返等方法,可以...

    PLSQL developer 64 位

    在使用PLSQL Developer时,用户可能还需要了解Oracle的体系结构,包括表空间、用户、权限等概念,以及如何通过PL/SQL语法进行数据操作和事务管理。对于更高级的用法,如性能优化、存储过程的并发控制和异常处理,也...

    PLSQL12免安装版

    InstantClient包含了必要的库文件,使得PLSQL Developer可以远程连接到Oracle数据库,进行数据查询、更新、事务处理等操作。 PLSQL Developer的主要功能包括: 1. **代码编辑器**:提供语法高亮、自动完成、错误...

    PLSQL相关书籍(PDF)

    12. **事务管理**:PLSQL支持事务的概念,包括COMMIT、ROLLBACK和SAVEPOINT操作,确保数据的完整性和一致性。 13. **并发控制**:PLSQL提供了锁定机制来处理多个用户同时访问同一数据的情况,如SELECT...FOR UPDATE...

    PLSQL学习基础课件PPT

    异常处理是PLSQL的一个重要特性,通过EXCEPTION关键字,你可以捕获并处理运行时可能出现的错误,例如SQL错误、逻辑错误或自定义异常,从而增加程序的健壮性。 最后,PLSQL还支持与Oracle数据库的其他高级特性交互,...

    PLSQL(中文版)

    学习PLSQL,你需要掌握如何声明和使用变量、处理流程控制(如循环、条件语句)、编写存储过程和函数、处理数据库事务、理解和使用异常处理机制,以及如何与其他数据库对象(如表、视图和索引)交互。同时,熟悉...

    PLSQL最新中文手册

    在PLSQL中,你可以创建一系列的程序逻辑,如循环、条件判断、异常处理等,这些在单纯的SQL语句中通常是无法实现的。PLSQL的结构包括声明部分、执行部分和异常处理部分,这使得开发者可以构建复杂的业务逻辑。 ...

Global site tag (gtag.js) - Google Analytics