前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于PowerBuilder的搜索

PowerBuilder事务(Transaction)处理 - 张连兵的博客 - 博客频道 - CSDN.NET 张连兵的博客 专注电子商务 & 物流信息技术! 目录视图 摘要视图 订阅 新年新气象------CSDN2014新版导航就要跟大家见面了 2014年1月微软MVP当选名单揭晓! “我的2013”年度征文活动火爆进行中! 专访何海涛:“不正经”程序员的进阶之路 PowerBuilder事务(Transaction)处理 分类: PowerBuilder 2008-03-19 17:29 2133人阅读 评论(0) 收藏 举报 PowerBuilder数据库sybasestring数据库服务器oracle PowerBuilder事务(Transaction)处理 数据库的事务管理简介 在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。   对事务的操作是这样进行的:先定义开始一个事务,然后对数据作修改操作,这时如果提交(COMMIT),这些修改就永久地保存下来,如果回退(ROLLBACK),数据库管理系统将放弃您所作的所有修改而回到开始事务时的状态。此外有些数据库支持事务的"存储点(savepoint)这一概念:即在一个事务进程中任意一点您都可以进行当前状态的存储,回退时只是回到你所设定的存储点,而不必退回全部的事务。如果您的事务可以分成几组对数据库的修改,那就可以设置多个存储点,根据需要您可以回退到任意一个存储点,而不使所有事务的修改数据全部丢失。   正确地管理事务可以保证数据的完整性,当您所做的工作全部完成和得到确认之前,没有任何数据物理地写进数据库。 看这样一个实例:有这样一个银行应用系统,前台使用者作出将储户甲的一百元存款划归储户乙帐下的操作;在后台的数据库中,这两个客户的记录分储在两张表中,当使用者在屏幕上作出如上操作时,在后台需要对两张表进行修改。如果在数据库中对甲用户存款余款作减去一百元修改后,对乙用户加一百元的操作修改却失败时,前一张表也必须回到修改前的状态,否则数据库的内容不统一,甲储户白白损失一百元,信息必然是不正确的。因此进行事务管理是必须的。   传统地,我们认为一个事务包括了对一个或多个表的修改,而随着分布式数据库和数据仓库的发展,事务可能包括了对一个或多个数据库的修改。在上例中甲乙两用户就可能是异地用户,信息分储在不同地域的不同数据库中,上述的一个事务就涉及到了对不同数据库的操作。 PowerBuilder事务对象(Transaction Objects) 是PowerBuilder中自动与数据库交互的控制者,它是PowerBuilder众多对象中最重要的一个对象,并且也是最不好理解的一个对象。是PowerBuilder程序与数据库之间传递信息的一个结构变量。 这个对象是PowerBuilder应用与数据库的通讯区域。PowerBuilder在应用开始时建立一个全局的事务对象SQLCA。由于大多数的应用只用到一个数据库,所以一般开发者主要也只用SQLCA作为与唯一数据库连接的事务对象。 PowerBuilder则通过事务对象传递连接信息给数据库,也可以从数据库取得信息,PB以指定事务对象进行的连接为事务管理单位。缺省事务对象为SQLCA,SQLCA全局有效,在任何脚本里都可使用,SQLCA 中包含连接数据库所需信息。   可以根据需要使用自定义事务对象,事务对象的使用也同其它对象一样需要定义事务对象变量,然后创建(分配空间),但全局SQLCA 无需定义和创建,SQLCA是应用分流运行时自动被创建。   使用步骤如下:   1、定义事务对象变量transaction OracleTrobject   2、创建事务对象,为事务对象变量分配空间OracleTrobject Transaction   3、指定连接信息   OraleTrobject.DBMS=″ORACIE″   OraleTrobject.Database=″DatabaseName″   OraleTrobject.UserID=″UserID″   OraleTrobject.DBpass=″DBpass″   OraleTrobject.serverName=″serverName″   OraleTrobject.LogID=″LogID″   OraleTrobject.Logpass=″Logpass″   如果使用SQLCA连接无需1、2步,但仍需使用本步对连接参数设置。   4、连接数据库connect using OracleTrobject或connect,使用SQLCA连接   5、建立事务对象与对应数据窗口连接   dw_oracle.SetTransobject(OracleTrobject)   6、取数据、更新数据   7、提交或回滚事务   COMMIT using OracleTrobject)   Rollback Using Oracltiobject)   8、断开连接、释放事务对象变量   Disconnect using OracleTrobject   Destrog using OracleTrobject   事务对象是数据窗口控件与数据连接的纽带,对使用缺省的事务对象SQLCA连接数据库,则无需使用Using子句。 数据窗口控件可以拥有自己的内部事务对象,通过dw_Oracle.Settrans(OracleTrobject)来设置数据窗口控件dw_Oracle的内部事务对象,实际上是把事务对象OracleTrobject 的内容拷贝到数据窗口控件dw_Oracle的内部事务对象中,然后通过此数据窗口控件对数据库操作,与事务对象OracleTrobject无关,即使之后对事务对象OracleTrobject内容作了改变,也不会影响数据窗口控件dw_Oracle 的内部事务对象内容。   多个数据窗口控件,可以共享某个事务对象。事务控制以事务对象为单位,事务的提交和回滚都是对应某个事务对象而言。连接数据库时只需在使用前进行一次连接即可,不必对数据窗口控件分别连接。可以通过建立多个事务对象同时与多个数据库建立连接,也可以多个事务对象根据不同的注册要求,设置不同的注册参数,连接至同一个数据库。 SQLCA共有15个成员。 序号 名称 类型 说明 1 DBMS string 所使用的数据库管理系统的名字,如Sybase,Oracle,ODBC。 2 Database string 要连接的数据库名字。 3 UserID string 连接数据库所用的用户名。有的DBMS不需要此项。 4 DBPass string 用户连接数据库的口令。 5 Lock string 这是数据库的保护级别,一般不必给出。 6 LogID string 登录到数据库服务器上的用户名,有的DBMS不需要此项,但Sybase和Oracle需要指定这个参数。 7 LogPass string 登录到数据库服务器上的用户口令。这个属性可设可不设,但Sybase和Oracle需要指定口令。 8 ServerName string 数据库服务器名。 9 AutoCommit boolean 指定是否将数据库设置成自动提交所有事务。默认是False,也就是说,必须在应用程序中进行事务管理,并在适当的时候对数据库提交事务。如果选择True,则每个事务都由系统自动提交。 10 DBParm string 用于向数据库传递特殊信息的属性。 11 SQLCode long 指示最近一次SQL操作失败或成功。返回结果值为: 0 无错误。-1 出现一个错误。 100 没有检索到数据。 12 SQLNRows long 最近一次SQL操作影响的行数,数据库不同其含义也不同。 13 SQLDBCode long 数据库错误代码。不同的数据库的含义不同。 14 SQLErrText string 相应于SQLDBCode属性中错误码的文字说明。 15 SQLReturnData string 返回DBMS执行SQL的附加信息,不同的DBMS其值不同。 例子:这是一个连接Sybase数据库所需的代码实例: sqlca.dbms="Sybase" sqlca.database="DatabaseName" sqlca.logid="LoginId" sqlca.logpass="PassWord" sqlca.servername="ServerName" sqlca.autocommit=false   PowerBuilder中的事务管理   PowerScript中常用的事务管理的语句有四个:COMMIT, ROLLBACK, CONNECT, DISCONNECT。   当您需要应用与数据库建立连接时使用CONNECT这一操作命令,取消连接时执行DISCONNECT,这两个命令一般分别用在应用的开始和结束,也就是Application的Open和Close事件中。   当一个事务的数据库修改都成功地完成后,修改须提交给数据库,COMMIT语句是一个旧事务结束和一个新事务开始的界线。在修改被提交前,数据库的数据并没有被真正地修改,这些修改被保留在某个工作区,只有作修改的用户才能看到这些被修改后的值,提交之后,则所有的用户就都可以看到新值了。   在事务的进程中发生某些错误,或者在操作中出于种种原因打算中止事务,须用ROLLBACK命令回退事务,如果已作的操作不用ROLLBACK命令取消,这些操作必将错误地作为下一个事务的一部分而导致数据库的混乱。   如果您使用的是多窗口的应用,却只用一个事务对象,就应格外注意ROLLBACK和COMMIT会影响事务的逻辑一致性。在某个窗口执行的这两个指令会使其他窗口应用中所进行到一半的工作提交或回退。   在多用户系统中,修改和提交的时间越接近,提交成功的可能性就越高。因为一个事务中所有的SQL语句全部执行成功而提交却失败是完全可能发生的,例如在您的事务过程中,另一个用户修改了数据并提交,这很可能使您作出的修改无效,这时COMMIT将失败,您必须回退这一事务的全部。   事务对象的AutoCommit属性   事务对象有一个AutoCommit的属性可以使开发者简化对事务管理的操作,这一布尔型的属性可以用TRUE或FALSE来对其赋值。当其为真时,PowerBuilder不通过其他额外的交互就将您的SQL语句传输给后台数据库,而且执行完毕自动提交。   当然,您可以设置AutoCommit属性为假(缺省值),使用COMMIT或ROLLBACK这样的关键词提交或回退事务。在大多数应用中,一部分的数据库操作是要成组提交的,而另一些则不用。因此我们可以利用AutoCommit的特性来确定事务的起点,当我们把AutoCommit的属性设为False时,系统设定此时为事务的起点。当AutoCommit设为真时,系统自动消取这一事务。因此你可以先把AutoCommit设为真,当您需要开始一个事务时,将其置为false,此刻即为事务起始点。   PowerBuilder内部这种事务管理的最大优点是方便。您不去考虑整个事务,而只需把您所作的修改提交或滚回即可。但是方便与可控性总是矛盾的,在PowerBuilder中没有存储点和嵌套事务管理的机制,即使您所使用的数据库支持这些特性,在PowerBuilder中却无法得以体现。不过在普通的应用中,存储点和嵌套事务管理并不是必须的,一般的事务管理足以够用。 用数据库的事务管理指令实现完全控制   上述的事务管理方式尽管简单方便,但是在某些应用中,我们也的确需要利用所用的数据库系统的嵌套事务和存储点的特性,而PowerBuilder内部的事务管理没有提供这样的功能,您必须自己设计。   自己进行事务管理的方式是直接使用数据库本身的事务指令。当您使用自己的管理方式时,就应使PowerBuilder停止管理事务,即设置AutoCommit为TRUE,系统内部就不会自动建构事务处理的命令了。实现人工事务管理的方式是采用EXECUTE IMMEDIATE这条PowerBuilder指令来执行任意的数据库操作。你所需做的是将数据库指令编辑成一个字符串,您可以执行任何的数据定义语句如建表、建主键、存储过程等,例如您可以用   EXECUTE IMMEDIATE BEGIN TRANSACTION trans-name   这样的指令开始一个事务。采用这种方法,只要您所用的数据库支持嵌套事务和存储点等事务管理,我们通过PowerBuilder开发出的应用也就同样可以实现。 更多 上一篇:数据库事务(Transaction)概述 下一篇:PowerBuilder的并发控制 查看评论 * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场 核心技术类目 全部主题 Java VPN Android iOS ERP IE10 Eclipse CRM JavaScript Ubuntu NFC WAP jQuery 数据库 BI HTML5 Spring Apache Hadoop .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP Spark HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap 个人资料 rambo_china 访问:121260次 积分:2578分 排名:第3465名 原创:123篇 转载:77篇 译文:0篇 评论:23条 文章搜索 文章分类 Acronym(7) Architecture(3) Web(14) JSP/JAVA/J2EE(12) C#/.NET(2) PowerBuilder(22) Oracle(17) SQL Server(7) OpenSource(2) maven(3) spring(5) jquery(1) IT强人(6) mysql(0) mybatis(2) OS/NETWORK(16) 信息化(21) 项目管理(5) 趣味故事(17) 英语短文(11) 优秀习惯(12) 物流技术(14) 文章存档 2013年08月(2)2012年11月(1)2012年09月(4)2012年07月(21)2012年06月(7)2010年08月(1)2010年07月(1)2010年05月(2)2010年03月(56)2010年01月(1)2009年12月(9)2009年09月(1)2009年05月(1)2009年04月(1)2009年02月(1)2008年12月(1)2008年11月(1)2008年10月(18)2008年09月(21)2008年08月(1)2008年06月(1)2008年05月(5)2008年04月(4)2008年03月(33)2008年02月(5)2007年11月(1) 阅读排行 Spring mvc @ResponseBody jquery ajax调用出现如下错误:406 Not Acceptable(3362) json-lib 的maven dependency(3000) spring mvc 与 jquery ajax(2905) SQL Server 2005调整兼容级别,存储过程:sp_dbcmptlevel(2731) alter system flush shared_pool的作用(2581) JSTL判断list的size()大小(2425) csc不是内部或外部命令,也不是可运行的程序,VisualStudio2008环境(2394) Error: PLS-00103: 出现符号 "CREATE"在需要下列之一时:(2190) 技巧(1)- 数据窗口的错误提示不显示(item '' does not pass validation test!)(2182) PowerBuilder事务(Transaction)处理(2133) 评论排行 Spring mvc @ResponseBody jquery ajax调用出现如下错误:406 Not Acceptable(7) csc不是内部或外部命令,也不是可运行的程序,VisualStudio2008环境(3) 网站设计知识css+div和table+css的比较(2) 中国物流信息化的五大瓶颈(1) IT doesn't matter,The right person really matter(1) Spring MVC 的请求参数获取(1) (function($){...})(jQuery)是什么意思(1) ORA-00904: “OLEVEL”: invalid identifier (exp导出数据报错)(1) API(3)- 在PB中如何注销当前用户、关闭计算机、重启计算机(1) web.config配置文件说明(1) 推荐文章 最新评论 Spring mvc @ResponseBody jquery ajax调用出现如下错误:406 Not Acceptable wangshoufu10: 我把myeclipse的所有验证都关掉之后,这个错误就没有了 Spring MVC 的请求参数获取 hft24dq: 拜谢! csc不是内部或外部命令,也不是可运行的程序,VisualStudio2008环境 Heking_22: 不错。谢谢分享。 Spring mvc @ResponseBody jquery ajax调用出现如下错误:406 Not Acceptable lujianan222: 我也遇到了,急求解决 csc不是内部或外部命令,也不是可运行的程序,VisualStudio2008环境 mcskyding: 不错,就找这个呢 (function($){...})(jQuery)是什么意思 cshoper: 很有帮助,谢谢! Spring mvc @ResponseBody jquery ajax调用出现如下错误:406 Not Acceptable a1234512356: 标签头 Spring mvc @ResponseBody jquery ajax调用出现如下错误:406 Not Acceptable a1234512356: 楼主在吗,帮我下好吗,我用的是spring3.2不知道怎么加依赖 org.codehaus.jac... Spring mvc @ResponseBody jquery ajax调用出现如下错误:406 Not Acceptable a1234512356: 需要加入jackson依赖?这个是怎么加啊?给个完整的图好吗 org.codehaus.jacks... Spring mvc @ResponseBody jquery ajax调用出现如下错误:406 Not Acceptable viaco2love: 我用jquery的加上一个validateboxEx.js他就可以了