目录 搜索
oracle知识 ORACLE的数据类型 Oracle技术网—DBMS_Job包的用法 Oracle技术网—Oracle for NT系统实用工具介绍 Oracle技术网—Oracle常见错误代码 Oracle技术网—Oracle常用Script Oracle技术网—Oracle常用数据字典 Oracle技术网—ORACLE数据库简介 Oracle技术网—Oracle特殊包 Oracle技术网—Oracle相关站点 Oracle技术网—哪些初始化参数最影响Oracle系统性能 PL/SQL DBA Oracle7 7.3.2.2 Oracle技术网—listener.log的内容增长很快,是否可以删除重建 Oracle技术网—ORACLE表空间恢复方案 Oracle技术网—Oracle常用系统文件有哪些 Oracle技术网—ORACLE回滚段管理(上) Oracle技术网—ORACLE回滚段管理(下) Oracle技术网—Oracle如何决定使用哪个回退段 Oracle技术网—Oracle数据库的空间管理技巧 Oracle技术网—Oracle数据库碎片整理 Oracle技术网—Oracle数据库有哪几种关闭方式 Oracle技术网—Oracle数据库有哪几种启动方式 Oracle技术网—Oracle预定义角色有哪些 Oracle技术网—ROLLBACK不能回滚的命令 Oracle技术网—查看哪些session正在使用哪些回滚段 Oracle技术网—存储参数(storage子句)含义及设置技巧 Oracle技术网—和权限有关的表有哪些 Oracle技术网—漫谈数据库的启动和关闭 Oracle技术网—哪些初始化参数最影响Oracle系统性能 Oracle技术网—如何备份控制文件 Oracle技术网—如何查出前台正在发出的sql语句 Oracle技术网—如何查看Oracle版本及安装了哪些选项 Oracle技术网—如何查看Oracle数据表的建表语句 Oracle技术网—如何查看SGA区剩余可用内存 Oracle技术网—如何查看各个表空间占用磁盘情况 Oracle技术网—如何查看后台进程 Oracle技术网—如何查看什么时间有哪些数据库对象结构被修改过 Oracle技术网—如何查看数据库的各种数据文件 Oracle技术网—如何查看数据库的字符集 Oracle技术网—如何查看数据文件是否自动扩展 Oracle技术网—如何查看数据文件所在的路径 Oracle技术网—如何查看用户表上的约束内容 Oracle技术网—如何查看用户表所占空间的大小 Oracle技术网—如何查询出primary key和forgen key的关系表 Oracle技术网—如何改变当前联机日志文件的大小 Oracle技术网—如何利用DBMS_SQL包和游标计算当前用户下所有表的行数 Oracle技术网—如何启动ARCHIVELOG模式 Oracle技术网—如何取出某一用户的密码,再原封不动的改回去 Oracle技术网—如何设置BLOCK_SIZE大于2K,如:4K、16K Oracle技术网—如何手工指定使用哪个回退段 Oracle技术网—如何修改internal的口令 Oracle技术网—如何移动控制文件到新的目录中 Oracle技术网—如何移数据库文件 Oracle技术网—如何增加表空间的大小 Oracle技术网—怎样查看init.ora文件 Oracle技术网—怎样查看SGA值 Oracle技术网—怎样查看哪些用户拥有SYSDBA、SYSOPER权限? Oracle技术网—怎样快速查出Oracle 数据库中的锁等待 Oracle技术网—怎样识别IO竞争和负载平衡 Exp vs Imp Oracle技术网—EXP、IMP 命令详解 Oracle技术网—Exp/Imp大量数据 Oracle技术网—Export/Import 使用技巧与常见错误 Oracle技术网—Oracle数据库的备份与恢复 Oracle技术网—如何把数据exp到Sql loader里 Oracle技术网—如何单独备份一个或多个表 Oracle技术网—如何单独备份一个或多个用户 Oracle技术网—如何导入指定表 Oracle技术网—如何建立一个与现存数据库相同,但不包含数据的空库 Oracle技术网—如何在oracle7和oracle8之间exp/imp数据 Oracle技术网—提高ORACLE数据库系统import性能 Oracle技术网—为何我的导出文件只有500K Oracle技术网—自动备份Oracle数据库 Oracle技术网—作Export或Import时,如何记录LOG信息? SQL技巧 Oracle技术网—LONG数据类型使用上的一些说明 Oracle技术网—Oracle8 PL/SQL编程风格与系统性能的提高 Oracle技术网—Oracle8中用户名、表名、列名、索引名...可以用中文命名吗 Oracle技术网—Oracle中如何实现某一字段自动增加1 Oracle技术网—SQL(Structured Query Language)语句分哪几类 Oracle技术网—SQL*PLUS常用命令列表 Oracle技术网—SQL*Plus系统环境变量有哪些?如何修改? Oracle技术网—SQL*Plus中缓冲区命令列表 Oracle技术网—SQL*Plus中能运行哪几种命令 Oracle技术网—SQLPlus中的复制和粘贴技巧 Oracle技术网—查看本用户下的各种对象的SQL脚本 Oracle技术网—查找a表中有,而在b表中没有的记录 Oracle技术网—利用PL/SQL打印ASCII表 Oracle技术网—如何查找、删除表中重复的记录 Oracle技术网—如何对CLOB行字段执行全文检索 Oracle技术网—如何对CLOB字段进行全文检索? Oracle技术网—如何改变表中列的名字 Oracle技术网—如何改变一个字段初始定义的Check范围 Oracle技术网—如何给表、列加注释 Oracle技术网—如何将 primary key 建在其它的表空间上 Oracle技术网—如何删除表中的列 Oracle技术网—如何使‘CREATE TABLE AS SELECT’能支持ORDER BY ? Oracle技术网—如何通过 SQL*PLUS 将符号 & 、'号(单引号) 插入Oracle数据库的表中 Oracle技术网—如何用SQL生成SQL批处理文件 Oracle技术网—如何在PL_SQL中读写文件 Oracle技术网—如何自动生成一个含有20000101至20500101共50年日期的表 Oracle技术网—如何自动生成一个含有2000年01月至2050年01月共50年月份的表 Oracle技术网—删除a表中和b表相同的数据 Oracle技术网—在Oracle快速进行数据行存在性检查 Oracle技术网—怎样查看表的结构 Oracle技术网—怎样改变SQL*Plus启动时默认路径 Oracle技术网—怎样计算表中的记录数 Oracle技术网—怎样在SQL*Plus中使用 '&' 来实现自定义参数变量? Oracle技术网—怎样在查询记录时给记录加锁 Oracle错误 Oracle7 7.3.2.2 Oracle技术网—Oracle 816中如何启动Enterprise Manager Oracle技术网—Oracle Enterprise Manager(OEM)工具中如何以SYSOPER、SYSDBA方式登录 Oracle技术网—ORACLE数据库应用开发常见问题及排除 Oracle技术网—监听器错误 Oracle技术网—联机热备份失败后,如何打开数据库 Oracle技术网—没有备份、只有归档日志,如何恢复数据文件 Oracle技术网—某个数据文件损坏,如何打开数据库 Oracle技术网—如何使用归档日志进行完全恢复 Oracle技术网—如何正确建立TYPE、partition(分区) Oracle技术网—一个控制文件被损坏,如何启动 Oracle技术网—在SQL*Plus中insert进的都是中文的,为什么一存入服务器后,再select出的就是???了 Oracle技术网—重装Oracle服务器后,以前的数据可以恢复吗 Oracle初学者入门 Oracle技术网—Oracle 8.1.6 for Win2000 系统文件解释 Oracle技术网—Oracle 基本知识 Oracle技术网—Oracle8 数据类型 Oracle技术网—what is sql? Oracle技术网—安装、配置后,SQL*Plus操作初步 Oracle技术网—安装Oracle后,经常使用的修改表空间的SQL代码 Oracle安装、删除 Oracle技术网—Oradim工具的用法 Oracle技术网—WINDOWS NT上,如何删除ORACLE SERVICE Oracle技术网—如何连接两台Oracle服务器 Oracle技术网—如何在Windows 2000下将Oracle完全卸载 Oracle技术网—如何在WINDOWS NT上删除所有的Oracle安装? Oracle技术网—手工安装数据库时需要安装那些系统包 Oracle技术网—手工创建数据库的全部脚本及说明 Oracle安全性问题 Oracle技术网—Linux ORACLE 8.1.5漏洞 Oracle技术网—Oracle 8.1.6的oidldapd中的漏洞 Oracle技术网—Oracle8的不安全因素及几点说明 Oracle技术网—Oracle数据库的安全策略 Oracle技术网—Oracle数据库密码文件的使用和维护 Oracle技术网—提高Oracle数据库应用系统安全的举例与分析 数据库安全性策略 Oracle系统设置、优化、连接 《Oracle8 优化技术》摘录 (第一章 安装) 《Oracle8 优化技术》摘录 (第二章 内存/CPU) 《Oracle8 优化技术》摘录 (第三章 输入/输出) Oracle技术网—ASP 中通过OLEDB访问 Oracle 的代码 Oracle技术网—Delphi5 企业版使用BDE访问 Oracle方法 Oracle技术网—oracle database access object Oracle技术网—Oracle基于Client/Server的性能调整 Oracle技术网—PB7 连接 Oracle 的配置方法 Oracle技术网—PB内置Oracle数据库接口的使用方法 Oracle技术网—PHP+Oracle(OCI) 初步 Oracle技术网—PHP4连接Oracle 8i的方法(转译) Oracle技术网—多个数据库时,如何设置默认数据库 Oracle技术网—如何备份Oracle设置 Oracle技术网—如何让你的SQL运行得更快 Oracle技术网—如何修改 SQL*Plus 的启动参数 Oracle技术网—如何在Windosws 2000中安装JSP并访问Oracle Oracle技术网—如何在Windosws 2000中安装perl并访问Oracle Oracle技术网—如何在Windosws 2000中安装PHP4并访问Oracle Oracle技术网—如何在Windosws NT中使用批处理命令自动启动或关闭Oracle Services Oracle技术网—如何在客户端省略输入数据库串,而只输入用户名、密码即可 Oracle技术网—使用Database Configuration Assistant安装第二个数据库 Oracle技术网—修改Oracle7数据库maxdatafiles参数的方法 索引、序列、快照、数据库链路、触发器 Oracle技术网—触发器的几种应用 Oracle技术网—建立触发器时最容易忽略的两个地方 Oracle技术网—快照和触发子结合使用的例子 Oracle技术网—能否通过视图更新表中的数据 Oracle技术网—如何创建一个简单的JAVA存储过程? Oracle技术网—如何创建隐藏IP地址的最后一项的函数? Oracle技术网—如何加密Oracle中的存储过程 Oracle技术网—为什么有时ORACLE数据库不用索引来查找数据 Oracle技术网—我的数据库链路为什么不工作 Oracle技术网—一个建立快照的简单例子 Oracle技术网—怎样创建一个简单的自定义过程并引用 Oracle技术网—怎样手工刷新快照 oracle与其他数据库的比较 MySQL 测试 Oracle技术网—Oracle 和 mysql 的一些简单命令对比参照 Oracle技术网—Oracle8i和Microsoft SQL Server7.0比较 Oracle技术网—比较SQL Server与Oracle、DB2 Oracle技术网—各种数据类型的比较 Oracle技术网—戏说SQL—几种SQL 服务器的比较 关键任务      在Internet上运作公司是一项艰苦的任务 其它知识 OEM常见问题及其解决办法 Oracle 8 资料库函式库 Oracle 资料库函式库 Oracle技术网—Decode()函数使用技巧(NT+IIS+ASP+ORACLE) Oracle技术网—Dual伪列 Oracle技术网—NULL 使用详解 Oracle技术网—OLAP及其多维数据分析 Oracle技术网—Oracle for NT系统实用工具介绍 Oracle技术网—ORACLE 用户的规范化管理 Oracle技术网—user、uid伪列 Oracle技术网—大型数据库设计原则 Oracle技术网—留言簿(带Oracle数据库分页的显示功能) Oracle技术网—漫谈oracle中的空值 Oracle技术网—如何正确利用Rownum来限制查询所返回的行数 Oracle技术网—什么是ROWID,为什么需要它 Oracle技术网—数据库技术考试大纲(中级) Oracle技术网—数据库行业的现状和展望 Oracle技术网—在客户端处理Oracle的数据行加锁问题 如何对CLOB行字段执行全文检索 Developer 2000 Oracle技术网—Developer/2000中各键盘触发子所对应的“按键” Oracle技术网—FORM调用REPORT时,如何去掉report server Oracle技术网—FORM中,Exception(例外)都有哪些,如何书写 Oracle技术网—FORM中,FORM中,如何引入图像 Oracle技术网—FORM中,WINDOW标题的设置 Oracle技术网—FORM中,常用快捷键有哪些 Oracle技术网—FORM中,触发子exit_form的两种功能是什么 Oracle技术网—FORM中,当光标走到块的最后一项时,如何让按“enter回车”键时,光标自动走到下一条记录的第一项? Oracle技术网—FORM中,当用鼠标点击标签画布的某一“标签页”时,如何判断点击的是哪一页 Oracle技术网—FORM中,如何屏蔽默认的功能键 Oracle技术网—FORM中,如何实现屏幕同步刷新? Oracle技术网—FORM中,如何使用警告 Oracle技术网—FORM中,如何通过 ODBC 访问 Acress 数据? Oracle技术网—FORM中 Oracle技术网—FORM中,设置应用特性(光标类型) Oracle技术网—FORM中,怎样创建动态下拉列表List Oracle技术网—FORM中如何存取声音 Oracle技术网—FORM中如何存取图象?如何把图象从一个表中导到另一个表中? Oracle技术网—MIS中的图像应用技术 Oracle技术网—MIS中的图像应用技术 Oracle技术网—从FORM中调用REPORT时,如何使打印结果直接输出到打印机上 Oracle技术网—如何从FORM中调用REPORT程序 Oracle技术网—如何改变FORM(FMX模块)运行时的title? Oracle技术网—如何在FORM运行中,使定制菜单中的“窗口(W)”菜单项不显示 Oracle技术网—如何在启动FORM程序时直接登录到Oracle数据库上? Oracle技术网—运行FORM时,如何使按钮变灰(即无效) Oracle技术网—运行FORM时,如何使窗口(runtime窗口、画布窗口)自动变成最大化、最小化? Oracle技术网—在Developer/2000中如何读写文本型操作系统文件 Oracle技术网—在Oracle中实现报表的定长输出 linux vs Unix How To Install Oracle 8.0.5 onto RedHat Linux 6 HOWTO: OAS for Linux on FreeBSD HOWTO: Oracle for Linux on FreeBSD Oracle 7.3.4 Enterprise Edition for SCO UNIX 安装步骤 Oracle技术网—Oracle .com 套件在TurboLinux上的安装 Oracle技术网—ORACLE 7.3 Enterprise在SCO OPEN SERVER 5.02 及 5.04 的安装过程 Oracle技术网—ORACLE 7.3.4.2 for SCO Unix 安装说明 Oracle技术网—Oracle 8 for solaris 2.6 安装步骤 Oracle技术网—Oracle 8(8.0.5)标准版安装指南 Oracle技术网—Oracle 8i(8.1.5)企业版安装指南 Oracle技术网—ORACLE FOR SUN SOLARIS 安装手册 Oracle技术网—ORACLE FOR SUN SOLARIS 维护手册 Oracle技术网—ORACLE V.7.3.4.3 FOR AIX 安装说明 Oracle技术网—ORACLE8I FOR SUN SOLARIS2.7 安装说明 Oracle技术网—RedHat 6.1 Step-by-step Install notes for Oracle 8i Oracle技术网—RedHat Linux 6.0 上 Oracle 8(8.0.5)标准版 安装实例 Oracle技术网—RedHat Linux 6.0 上 Oracle 8i R2 (8.1.6) 企业版安装实例 Oracle技术网—如何集成Linux/Apache/PHP4/FastCGI/Oracle/MySQL环境 Oracle技术网—如何在你的Linux机器上安装运行Oracle Oracle技术网—为Linux配备Oracle 8 Oracle技术网—在RedHat 6.0上安装Oracle 8i(全攻略)
文字

在客户端处理Oracle的数据行加锁问题

摘自:不详

摘要:

本文简单阐述了一般数据库锁,以ORACLE为例的加锁问题,提出了解决ORACLE的数据行加锁及并发性处理的一般办法.并给出了用PB编程两种实现方法.

关键词:

ORACLE,加锁,解锁,行锁, PowerBuilder

数据的完整性和并发性:

在网络数据库处理数据中,需要保证数据的完整性、多事务的并发性和数据的一致性。数据库系统必须最大限度的保证数据内容的有效性和合理性,使得数据合法与合理,即保证数据的完整性。而网络(多用户)数据库应用系统中,通常都会遇到多个事务同时请求修改同一数据。数据库的并发性处理保证数据库系统据能够合理有效地处理多个事务请求,在数据库管理系统协调下,宏观表现为并行处理,微观为逐个串行处理,保证数据的一致性,从而避免数据处理中的 数据发生。在数据库系统本身对数据的并发性和一致性有基本控制能力下,以Oracle为例的关系数据库系统已经能保证数据的并发性能,而数据库的应用设计则需要以考虑数据在并发过程中的一致性为重点。一个简单的例子:甲乙同时从数据库中读出了一条相同的数据记录。甲把数据作了修改,并且作了事务提交。(而乙此时并不知道数据已经被修改了。)称乙已经读出的数据为脏数据,破坏了数据的一致性 , 为了保证数据的一致性,此时有必要对数据进行加锁。再例如:一银行帐户有¥6000, 此时甲要从中提出¥5000,而乙也同时要从中提出¥5000,双方在不加锁查询时,双方均认为可以提款,事实上肯定有一方的提交会失败。原因是在最终事务提交时,要对数据作了加锁查询效验处理。 

A0事务

 

B0事务

加 锁

 

加 锁

 

 

 

 

解 锁

解 锁

A1事务

 

B1事务

并发性和一致性 

  1. 数据库中的数据锁
  2. 为了防止多个用户事务交替操作数据库对象,破坏性数据库完整性,同时又要保证数据的并发性和一致性,数据库管理系统一般提供了各种类型的封锁机制,可以自动为一个事务封锁资源,而在事务不需要时自动释放。以使另一个需要独占该资源的事务能够继续进程,而不会造成事务死锁。数据库对象的封锁完全能够由数据库系统自动完成,ORACLE (一般情况数据库)对加锁有以下特征:A 多种封锁模式.例如:系统表的转有锁,共享锁。B 完备的自动加/解锁功能和释放机制。C 用低级别的封锁换取高级别的并发处理。D能够在客户端/服务器模式下自动封锁过程。Oracle 的主要封锁类型有:

    A 数据锁,用于封锁表或表中的指定行.属于数据操纵锁,

    B 字典锁,用于保护数据库对象(表,索引)的创建维护.属于数据定义锁

    C 内部锁。用于保护数据库的内部结构.

    正常情况下,为完成数据操纵,一般需要两种级别的封锁方式,封锁整表或行封。通常只在热备份数据,时候,需要对整表进行锁定. 而应用程序的事务处理通常是数据行的数据操纵语句:

    INSERT,

    UPDATE,

    DELETE,

    SELECT (FOR UPDATE)

    以上操作在执行过程中,数据库都会对相应的行做数据行封锁.

    一般情况下,只要行封事务不放弃封锁, 此行就不可能被其他任何用户的事务修改(部分语句,如SELECT仍然允许不加锁地读出)。只有当数据库重新启动,数据表空间离线/在线处理,当事务正常提交、回滚时,行封事务才能被自动解除封锁. (通常 ROLLBACK ,COMMIT 可以自动解除行封锁。)在表上的数据锁的高低级别为:

    表专有

    共享行专有

    共享

    行专有

    行共享

    Exclusive

    ShareRoweXclusive

    Share

    RoweXclusive

    RowShare

    EX

    SRX

    S

    RX

    RS

    简单的SELECT 语句无任何锁,INSERT, UPDATE, DELETE为行专有(RX),允许在操作中多次修改这些行, 提交或回滚后自动解除封锁,

    SELECT (FOR UPDATE )为专有行的数据锁.在应用程序中使用最多.也是通常对数据行进行控制的简单有效的方法。例如:在Windows95下,同时分别用两个以上SQL*PLUS,以相同的用户联接Oracle Server相同的实例,在其中一个窗口下做Update/Delete中任意操作,只要没有提交,均不影响其它窗口的不加锁查询,但是不可以再其它窗口下对同一条记录作Update/Delete 操作,Insert没有提交以前,其它操作均无效。只有当一方事务完成(提交/回滚)以后立即释放相应资源,另一方申请的事务才能成功响应。

  3. 行锁在应用程序的注意事项
  4. 在实际应用中,可能由于一次事务提交的数据太多,造成数据加锁时间太长,破坏了数据的并发共享特性。如果事务独占了相应的资源,没有得到释放,而另一个事务占有该事务的下一个资源,就有可能造成数据库应用系统死锁。另外,如果在加锁过程中,出现网络中断,客户端掉电等突发问题,被加锁的资源无法解锁,其它应用程序将无法继续获得已经被加锁的资源,也可以出现死锁. 通常只有DBA才能取消事务或通过数据表空间的在线/离线操作解除加锁事务(通常大型应用系统这样做有一定的风险)。如果在程序应用中经常出现这样的问题,则造成应用数据库应用系统无法正常工作。虽然这样的情况在C/S程序的开发/应用中并不经常出现,但是在应用程序设计中都是应该严格考虑的。

  5. 常用的数据加锁方法(以ORACLE 与PB连接为例)
  6. A 在客户端编程方法:在客户端的编程处理的方法最简单,调试也很直观、方便。但是这种方法仅仅在中、小型网络中可以使用。因为当网络用户数量增加,或应用程序在客户端应用过程中意外中断(死机,退出),则可能造成数据行的死锁。其他用户无法正确独占加锁。但是实际应用表明此种方法在网络自身可靠性好、用户数量不大时经常被采纳

    下面是用POWERBUILDER 与 ORACLE的数据联结处理实例。

    STRING ls_goodscode

    INTEGER li_stroe_qty

    ls_goodscode = sle_goodscode.text

     

    SELECT QTY

    INTO li_store_qty

    FROM AMS.TAB_STORE_GOODSINFO

    WHERE GOODS_NO = SUBSTR(:ls_goodscode , 1, 13)

    AND SERIAL_NO = SUBSTR(:ls_goodscode , 14, 4)

    FOR UPDATE NOWAITE ; // 对数据加锁,不等待。

     

    if SQLCA.SQLCODE = 0 then // if _01

    if li_store_qty >=2 then // if _02

    UPDATE AMS.TAB_STORE_GOODSINFO

    SET QTY = :li_store_qty - 2

    WHERE GOODS_NO = SUBSTR(:ls_goodscode , 1, 13)

    AND SERIAL_NO = SUBSTR(:ls_goodscode , 14, 4);

     

    if SQLCA.SQLCODE = 0 then

    COMMIT ; // 成功提交

    else

    ROLLBACK ;// 及时回滚解锁

    messagebox("系统提示", "库存数量已经不足!");

    end if

    else

    ROLLBACK;

    messagebox("系统提示", "库存数量已经不足!");

    end if // end if 02

    else //其中 ORA-00054: resource busy and acquire with NOWAIT specified

    ROLLBACK ;// 及时回滚解锁

    messagebox("系统提示", "数据读入有误,请稍候再试!",stopsign! ok!);

    end if // end if 01

    //同时在当前的FROM WINDOW中的CLOSEQUERY中显示写明ROLLBACK ;

    设计说明:当第一句SELECT完成以后,如果数据加锁正确,则可以继续工作,但是此时可能数据被别的应用程序控制,则返回Oracle的错误代码:

    ORA-00054说明共享冲突此句可以用一个有限的循环控制,但是一定要防止数据死锁。同时为了保证万无一失,在当前FORM的关闭事件中显示写明回滚(ROLLBACK)。

     

    B 在客户端按传输(Transaction )方法处理:将要提交的所有SQL任务作为多个子串传送到服务器端,用动态SQL方法在客户端一次传输完成后,在服务器端一次执行完成,只有当事务执行正确,才能提交, 否则回滚。这样在执行多个表操作提交时,数据执行加锁的时间影响将大大减小。这样极大程度的缓解了多表共享数据的加锁问题。好处是不需要服务器端的调试,但是,编程调试过程复杂。但是实际效果与第一种方法基本一致。

     

    C 存储过程方法:这种方法是直接调用服务器的存储过程,所有的对Client端程序代码可以大大减少,数据一致性,并发性,安全性都能得到保证。客户端的异常通常不会影起数据的死锁。

    下面是用POWERBUILDER 与 ORACLE的数据联结处理实例。

     

    STRING ls_goodscode

    INTEGER li_stroe_qty

     

    ls_goodscode = st.text

    if len(ls_goodscode) = 17 then

    DECLARE pstore_goods PROCEDURE FOR pd_store_goods(:ls_goodscode ) ;

    // 从库存数中减去 2

    execute pstore_goods;

    if SQLCA.SLQCODE < 0 then

    ROLLBACK ;

    messagebox("系统提示", "数据操作有误,请稍候再试!",stopsign! ok!);

    end if

    else

    messagebox("系统提示", "数据输入有误!",information!, ok!);

    end if

     

    //同时在当前的FROM WINDOW中的CLOSEQUERY中显示写明ROLLBACK ;

     

    在服务器端

    -- procedure pd_store_goods

    create or replace procedure pd_store_goods ( ls_goodscode in varchar2 )

    IS

    ln_store_qty number(10) ;

    begin

    SELECT nvl(QTY, -1)

    INTO ln_store_qty

    FROM AMS.TAB_STORE_GOODS_INFO

    WHERE GOODS_NO = SUBSTR(ls_goodscode , 1, 13)

    AND SERIAL_NO = SUBSTR(ls_goodscode , 14, 4)

    FOR UPDATE NOWAIT;

    if ln_store_qty >= 2 then

    UPDATE AMS.TAB_STORE_GOODS_INFO

    SET QTY = ln_store_qty - 2

    WHERE GOODS_NO = SUBSTR(ls_goodscode , 1, 13)

    AND SERIAL_NO = SUBSTR(ls_goodscode , 14, 4);

    COMMIT ;

    else

    ROLLBACK ;

    RAISE_APPLICATION_ERROR(-200002, 'store not enougth!');

    end if;

    EXCEPTION

    WHEN OTHERS THEN

    RAISE_APPLICATION_ERROR(-200001, 'store not SCUESSCULL!');

    end ;

    设计说明

    :首先在SQL*PLUS中运行存储过程,在PB的程序端调用。只有当SELECT语句正常加锁后, UPDATE语句才可以正常执行。在由此可见在客户端不知道存储过程运行的内容,调试/维护工作较麻烦。但是,因为所有的运行都在服务器端,基本可以忽略除服务器端以外的所有问题,如网络的通畅,客户端异常等等。实际应用中对大型繁重的数据处理大多采用这样的方法。

     

  7. 注意与小结:

在Oracle的连接中,需要解释的是数据行加锁在同一个事务中是不可见的,但是执行权限级别顺序为:Delete >Update >Insert >Select.

本文以Oracle为例,说明在数据库处理过程中,在数据库设计上,要考虑数据的数据的完整性,在数据库的应用设计上必须着重事务的并发性和数据的一致性。对于数据行锁要谨慎对待。

(以上程序在广东大亚湾核电物资管理系统中运行通过)

(全文完)

 

联系地址: 610054 成都市 建设北路 电子科技大学 97S4 张卫华

Email : hamlet@163.net

上一篇: 下一篇: