专利名称::基于网格的补偿事务自动产生方法
技术领域:
:本发明涉及的是一种计算机应用
技术领域:
的方法,具体是一种基于网格的自动产生补偿事务的方法。技术背景由于网络延迟和商业过程的交互,即使在没有并发事务的情况下,商业事务一般也会持续比较长的时间,因而也被称为长事务。为了减少资源被占用的时间,提高资源利用率和系统性能,组成长事务的子事务应该在全局事务结束之前提交并释放其占用的资源。如果某些子事务失败或用户需要选择提交结果时,对已提交子事务的撤销必须用执行相反任务的补偿事务来完成。1987年Garcia-Molina等人在《ProceedingsofInternationalConferenceonManagementofData,ACMSIGMODRecord16(3)》(ACMSIGM0D论文集16巻第3期)上发表了"Sagas(—种长事务模型)",该文提出了一种减少长事务资源占用时间的方法,即将长事务拆分成一组预先定义好执行顺序的子事务L(1《i《n),并为每个子事务编写一个补偿事务Ci(l《i《n),每个补偿事务G能语义地撤消由Ti的提交对系统产生的影响。该方法中,每一个子事务被允许单独提交,并立即释放其占用的资源,以提高资源的利用率。基于该模型,有不少人对此作了进一步的改进。经对现有技术文献的检索发现,Nodine等在《ProceedingsoftheTwenty-SeventhHawaiiInternationalConferenceonSystemSciences》(IEEE第27届Hawaii国际系统科学会议论文集)中基于Sagas的思想,提出了如何在多数据库事务中进行事务补偿,该方法通过步骤方法(st印approach)将若干本地数据库集成为一个多数据库系统;每个本地数据库被封装成一组步骤(st印s),每个步骤有一个关联的补偿步骤(compensatingst印),当事务需要补偿时,相关的补偿步骤被调用。上述方法的不足之处在于它们要求应用开发者在编写事务性应用程序时,必须为每一个子事务提供相应的补偿事务。这样的要求难以适应网格环境,主要原因是(1)网格服务具有自治性。服务提供者可以根据自身的商业模式设置特定的补偿要求,应用开发者在开发阶段无法知道在事务执行之前动态发现的网格服务具有哪些特殊的补偿要求。(2)大大增加了事务性网格应用的开发工作量与复杂性。与分布式数据库事务相比,网格服务涉及的操作及应用语义要复杂得多,编写补偿事务给关键性网格应用的开发带来了很大的工程量和复杂性及其困难。
发明内容本发明的目的在于克服上述现有技术中的不足,提供一种基于网格的补偿事务自动产生方法,即在长事务执行过程中动态产生相应的补偿事务,为网格环境下透明的事务补偿提供支持,同时,用户也可以使用自动产生的补偿事务对子事务的提交结果进行选择。本发明是通过以下技术方案实现的,本发明包括如下步骤首先创建针对数据修改事件产生补偿操作的行级触发器,然后由补偿事务产生器始终监视着子事务的执行;其次当影响系统状态的事件发生时,补偿事务产生器根据事件的类型调用相应的行级触发器,自动产生从语义上撤销该事件影响的补偿操作;最后,当子事务提交时,补偿事务产生器将该子事务执行过程中所产生的补偿操作组合成补偿事务,完成自动产生补偿事务。所述的行级触发器,是指基于数据库的触发器机制创建的针对数据修改事件而产生语义相反的补偿操作的三个存储过程模块,分别用于补偿更新、插入、删除三种语句,动态产生相应数据修改事件的补偿操作。行级触发器根据数据表中行的标识符对被修改的所有行进行补偿,不需要逐行匹配记录,从而加快补偿操作的产生速度,提高系统性能。行级触发器的工作过程具体如下(1)创建行级触发器提供数据表的名字,根据名字可从用户表视图中获得数据表的结构信息,包括所有字段名称以及字段的数据类型,因为数据库的USER—TAB—COLUMNS视图提供了静态数据词典视图,静态数据词典视图描述了视图的相关结构信息,每个数据表产生create—insert—trigger(插入行级触发器),create—update—trigger(更新行级触发器),create_delete_trigger(删除行级触发器)三个存储过程模块,即三个行级触发器,它们分别用于补偿插入、更新、删除语句,三个行级触发器的输入参数都是其服务的数据表名称,当被调用时,它们产生补偿插入、更新、删除的补偿操作。(2)行级触发器动态产生数据修改事件的补偿操作当数据修改事件出现时,补偿事务产生器根据事件类型调用相应的行级触发器,行级触发器生成具体的补偿操作,补偿操作是在子事务的执行过程中动态产生的,假如子事务失败了,则在该子事务执行过程中所产生的所有补偿操作也被放弃,具体过程如下在插入事件出现时,产生相应的删除语句将插入的记录删除;在删除事件出现时,产生相应的插入语句将删除的记录再次插入;在更新事件出现时,需要将被改变的记录恢复成更新前的数据。在产生补偿操作的过程中,行级触发器通过数据表的结构信息,判断字段的数据类型;使用字符串拼接的方式,动态产生补偿操作。对于不同的数据类型,处理方式有所不同对数值型的数据,直接与补偿操作片断的字符常量连接;对字符串型的数据,则需要在这个值之前和之后,分别拼接一个单引号,作为补偿操作中字符串直接量的开始与中止符;对日期时间型的数据,需要首先将值转化为字符串,然后在产生的补偿操作中利用TO—DATE函数将字符串值重新转换为日期时间。所述的补偿事务产生器,是指用于动态产生补偿事务包括三个行级触发器的模块。补偿事务产生器在子事务从开始到被确认或撤销的整个过程中,补偿事务产生器监视各种影响系统状态的事件;当影响系统状态的事件出现时,补偿事务产生器执行相应动作对于事务上下文消息,记录全局事务标识符和输入参数;预提交消息表示事务中包含的数据修改操作开始被执行,因此,补偿事务产生器开始根据子事务中数据修改操作的类型调用相应的行级触发器,自动产生数据修改事件的补偿操作,并在子事务成功提交后使用定界符将补偿操作封装成补偿事务,然后存储在数据库中;对于撤销消息,调用存储在数据库中的补偿事务;对于确认消息,删除存储在数据库中的补偿事务。网格长事务由多个子事务组成,分别由处于不同网络节点上的网格服务来完成,补偿事务产生器被安装于实际执行子事务的每一个网格服务上。所述的影响系统状态的事件,是指改变事务处理系统状态的各种外部操作事件,有三大类事务协调事件、数据修改事件和服务自定义事件。所述事务协调事件是指子事务从协调者收到了事务协调消息,包括事务上下文消息、预提交消息、撤销消息、确认消息,所述事务上下文消息用于协调者通知参加者事务开始、事务标识符、事务类型、协调者网络地址、事务执行有效期等信息;所述预提交消息用于协调者通知参加者提交;所述确认和撤销消息分别用于用户确认和撤消已经提交的子事务。所述数据修改事件是指子事务中包含的改变数据库中数据的操作,本发明针对关系型数据库,因而数据修改操作包括插入(insert)、删除(delete)和更新(update)。所述服务自定义事件是指网格服务提供者根据自身需要设置的特殊要求,如对撤销订单的用户收到一定的违约金。所述的自动产生数据修改事件的补偿操作,是指根据数据修改的三类操作即插入、删除和更新,分别调用相应的行级触发器,产生补偿操作。必须遵循的原则是,一段时间内,一个数据库被多个并发事务访问,假设事务历史H=1>1>0\,i^j,原事务Ti所访问的数据对象被并发的依赖事务Tj所修改,补偿事务CT,只能撤销由原事务Ti本身提交所作出的所有改变,但不改变依赖事务力的提交结果。所述的补偿操作记录在数据库中,多个并发事务产生的补偿操作存放在同一张表中,相互之间用事务标识符加以区分,对于同一个全局事务的多个子事务,当访问同一站点的不同服务时,它们的补偿操作在同一个记录补偿操作的数据库中,因此使用全局事务标识符和执行子事务的网格服务名的组合加以唯一区分。所述的补偿操作与原事务的执行顺序相反,在记录补偿操作时,还需要附加一个序列号,指示此补偿操作产生的先后顺序,使得后产生的补偿操作先执行,先产生的补偿操作后执行,这个序列号是时间戳,或是从一个序列中选择的递增的序列号。所述产生补偿操作的行级触发器、记录补偿操作的数据库、以及递增的序列号,这些数据库对象均通过存储过程来创建,通过提供一个补偿操作包,提供3个存储过程用于创建这3种对象。所述自动产生补偿事务,是指如果子事务提交成功,补偿事务产生器将产生的补偿操作封装在开始(Begin)和提交(Commit)之间,构成一个完整的事务,新产生的补偿事务被存储在数据库中,在需要时执行补偿事务;如果子事务提交失败,所有产生的补偿操作都将被放弃,当下一个事务执行时,产生的补偿操作属于另一个补偿事务。与现有技术相比,本发明的方法支持网格环境下补偿事务的自动产生,可以减少网格长事务应用的开发工作量和开发周期近50%,便于用户对事务提交结果的选择,从而解决了
背景技术:
的不足。由于在网格长事务执行过程中动态产生补偿事务,本发明可以为网格环境下的关键性应用提供透明的可靠性支持;突破自治的网格服务提供者设置特殊补偿要求的限制,这些为网格技术在商业环境的透明应用提供了技术支撑。图1为本发明工作原理框图;图2为本发明执行补偿事务的类的示意图。具体实施方式下面结合附图对本发明的实施例作详细说明本实施例在以本发明技术方案为前提下进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施例。如图1所示,本实施例基于关系数据库Oracle,本实施例实现过程如下步骤一,创建针对数据修改事件产生补偿操作的行级触发器;所述的行级触发器,是指基于数据库的触发器机制创建的针对数据修改事件而产生语义相反的补偿操作的三个存储过程模块,分别用于补偿更新、插入、删除三种语句,动态产生相应数据修改事件的补偿操作。行级触发器根据数据表中行的标识符对被修改的所有行进行补偿,不需要逐行匹配记录,从而加快补偿操作的产生速度,提高系统性能。提供数据表的名字,根据名字可从用户表视图中获得数据表的结构信息,包括所有字段名称以及字段的数据类型,因为数据库的USER_TAB_COLUMNS视图提供了静态数据词典视图,静态数据词典视图描述了视图的相关结构信息,用户表视图中部分与表结构相关的字段列在表1中。表1USERJTABj:OLUMNS(用户表)视图中部分与表结构相关的字段<table>tableseeoriginaldocumentpage11</column></row><table>本实施例每个数据表产生createjnsert一trigger(插入行级触发器),create—update—trigger(更新行级触发器),create—delete—trigger(删除行级触发器)三个存储过程模块,即三个行级触发器,它们分别用于补偿插入、更新、删除语句,三个行级触发器的输入参数都是其服务的数据表名称,当被调用时,它们产生补偿插入、更新、删除的补偿操作。创建行级触发器遵循以下二个原则(1)语义上撤销原操作的影响。行级触发器按表2如示的原则产生相应的补偿操作。在表1中,opi是Tj中的操作;0Pj是依赖事务Tj中的相关操作。表中涉及到两种替代概念相关替代和无关替代,相关替代指的是Ti提交后的状态Siw是和提交前的状态Si相关的,即Sw-f(Si,Ti),此时,copi必须消除opi的影响。例如,如果oppupdate(di,d2)并且d产d一n,则其补偿操作是cop;=update(d3,d4),这里d4=d3-n;无关替代是指Si+1与Si无关,即Si+1=f(Ti),这种替代操作不需要被补偿。如oPi=update("Monday","Tuesday"),opj=update("Tuesday",Wednesday")。(2)不影响并发事务的提交结果。一段时间内,一个数据库可能被多个并发事务访问,在实施例中,如果事务历史H-Ti。Tj。CTj(i^),Ti所访问的数据对象被并发的依赖事务Tj所修改,则补偿只能从语义上撤销事务Ti的影响,也就是说,补偿事务CTi只能撤销由原事务Tj本身提交所作出的所有改变,但不改变依赖事务Tj的提交结果。表2行级触发器对数据修改操作的补偿原则<table>tableseeoriginaldocumentpage11</column></row><table><table>tableseeoriginaldocumentpage12</column></row><table>下面是实施例中补偿删除操作的行级触发器create—delete—trigger的部分代码,各段意义如下CREATEORREPLACEPROCEDUREcreate_delete—trigger声明存储过程开始,其输入参数是table_iiame(即数据表名称)。EXECUTEIMMEDIATE'...,||'...,||…动态组装补偿操作。由于每张数据表的结构各不相同,数据表名table—name等信息只有在运行时才能获得,因此,触发器的创建有必要使用一种自动化的方式。PL/SQL语肓提供的EXECUTEIMMEDIATE语句可以在运行时组装补偿操作。代码段第11行至14行,计算出表的列数,并存储于cohimn_iiUmber。代码段第19行至28行,使用游标遍历all—tab_columns表。all—tab—columns是数据库系统存储所有表列信息的表。把table—name表的所有列名连接为字符串,并存储于cohimn一immes。代码段第36行至71行,CREATEORREPLACETRIGGERdelete—trigger—on_,创建触发器,并以表名加前缀delete—trigger—on—命名。代码段第47行至49行,获得当前子事务的标识符,并存储于current一subo代码段第51行至54行,根据CUrrent_SUb,获得当前子事务的补偿语句射j数。代码段第65行至70行,根据巳获得的信息,把补偿操作存储于数据库中。1CREATEORREPLACEPROCEDUREcreate—delete—trigger(2table_nameINVARCHAR2)AS3column—numberINTEGER;4column—namesVARCHAR2(300):=',;5column—薩es2VARC臓2(300):=',;6column—nameVARCHAR2(30);7iINTEGER:8TYPEcursor—typeISREFCURSOR;9column—cursorcursor—type;10BEGIN11EXECUTEIMMEDIATE'SELECTCOUNT(*)'12II'FROMall—tab—columns'13II'WHEREtable—name=UPPER("'||table—name||'")'14INTOcolumn—number;1516EXECUTEIMMEDIATE'ANALYZETABLE'||table—name||'VALIDATE17STRUCTURE';1819OPENcolumn—cursorFOR'SELECTcolumn_name'20II'F腿all—tab—columns'21II'WHEREtable—name=UPPER('"||table—name||'")';22FORiIN2..column—numberLOOP23FETCHcolumn—cursor24INTOcolumn—name;25column—names:=column_namesH,old.'||column—n咖eM',2627column—names2:=column—naraes2||column_namei|',':28ENDLOOP;2930FETCHcolumn—cursor31INTOcolumn—name;32column—names:=column—names||':old.'||column—name;33column—names2:=column—names2|1column—name;34(X0SEcolumn—cursor;3536EXECUTEIMMEDIATE'CREATEORREPLACETRIGGERdelete_trigger—on—'37IItable—nameII''38II'AFTERDELETE'39II'ON'Iitable—name||''40M'FOREACHROW'41II'DECLARE'42II'current—sub—idINTEGER;'43II'current—sub—countINTEGER;'<table>tableseeoriginaldocumentpage14</column></row><table>~~步骤二,补偿事务产生器始终监视着子事务的执行过程中影响系统状态的事件,当影响系统状态的事件发生时,补偿事务产生器根据事件的类型调用相应的行级触发器;所述的补偿事务产生器,是指用于动态产生补偿事务的模块,包括三个行级触发器。补偿事务产生器在子事务从开始到被确认或撤销的整个过程中,补偿事务产生器监视各种影响系统状态的事件;当影响系统状态的事件出现时,补偿事务产生器执行相应动作对于事务上下文消息,记录全局事务标识符和输入参数;预提交消息表示事务中包含的数据修改操作开始被执行,因此,补偿事务产生器开始根据子事务中数据修改操作的类型调用相应的行级触发器,自动产生数据修改事件的补偿操作,并在子事务成功提交后使用定界符将补偿操作封装成补偿事务,然后存储在数据库中;对于撤销消息,调用存储在数据库中的补偿事务;对于确认消息,删除存储在数据库中的补偿事务。网格长事务由多个子事务组成,分别由处于不同网络节点上的网格服务来完成,补偿事务产生器被安装于实际执行子事务的每一个网格服务上。所述的影响系统状态的事件,是指改变事务处理系统状态的各种外部操作事件,有三大类事务协调事件、数据修改事件和服务自定义事件。所述事务协调事件是指子事务从协调者收到了事务协调消息,包括事务上下文消息、预提交消息、撤销消息、确认消息,所述事务上下文消息用于协调者通知参加者事务开始、事务标识符、事务类型、协调者网络地址、事务执行有效期等信息;所述预提交消息用于协调者通知参加者提交;所述确认和撤销消息分别用于用户确认和撤消已经提交的子事务。所述数据修改事件是指子事务中包含的改变数据库中数据的操作,本实施例针对关系型数据库,因而数据修改操作包括插入(insert)、删除(delete)和更新(update)。所述服务自定义事件是指网格服务提供者根据自身需要设置的特殊要求,如对撤销订单的用户收到一定的违约金。所述的行级触发器,是指基于数据库的触发器机制创建的针对数据修改事件而产生语义相反的补偿操作的三个存储过程模块,分别用于补偿更新、插入、删除三种语句,动态产生相应数据修改事件的补偿操作。行级触发器根据数据表中行的标识符对被修改的所有行进行补偿,不需要逐行匹配记录,从而加快补偿操作的产生速度,提高系统性能。步骤三,行级触发器动态产生补偿操作;当数据修改事件出现时,补偿事务产生器根据事件类型调用相应的行级触发器,行级触发器生成具体的补偿操作,补偿操作是在子事务的执行过程中动态产生的,假如子事务失败了,则在该子事务执行过程中所产生的所有补偿操作也被放弃。行级触发器在被触发时能获知被修改行的唯一标识符,这些标识符在子事务中一个操作修改多行时,可以方便地为所有被修改行产生相应的补偿操作。例如,若一条更新语句更新了两行,则在更新每行时,行级触发器都被触发一次,从而获得当前正在被更新行的唯一标识符,补偿事务产生器接收到行级触发器被触发的信息,并为该行产生一条更新补偿操作。当以插入操作为条件的行级触发器被触发时,需要把被插入行的标识符、补偿操作类型(即刪除)、数据表名记录下来;当以更新操作为条件的行级触发器被触发时,则不仅要存储被更新行的标识符、补偿操作类型(即更新)、数据表名,还要建一张结构与原表相同的数据表,存储被更新行的原值,以备执行补偿时使用;当以删除操作为条件的行级触发器被触发时,不仅要存储补偿操作类型(即插入)、数据表名,还要建一张结构与原表相同的数据表,存储被删除行的原值,以备执行补偿时使用。另外,被删除行的标识符也必须存储,以备执行补偿时,查找其它补偿操作中对这个标识符的引用,并对其进行更新。在插入事件出现时,产生相应的删除语句将插入的记录删除;在删除事件出现时,产生相应的插入语句将删除的记录再次插入;在更新事件出现时,需要将被改变的记录恢复成更新前的数据。在产生补偿操作的过程中,行级触发器通过数据表的结构信息,判断字段的数据类型;使用字符串拼接的方式,动态产生补偿操作。对于不同的数据类型,处理方式有所不同对数值型的数据,直接与补偿操作片断的字符常量连接;对字符串型的数据,则需要在这个值之前和之后,分别拼接一个单引号,作为补偿操作中字符串直接量的开始与中止符;对日期时间型的数据,需要首先将值转化为字符串,然后在产生的补偿操作中利用TO—DATE函数将字符串值重新转换为日期时间。所述的补偿操作,其产生是由事件驱动的,根据正在执行的语句类型,以该语句为触发条件的行级触发器被触发,产生另一条起抵消作用的补偿语句。例如,当某子事务删除一个数据元素时,删除事件产生补偿操作onDdstedocompensationOperation('Insert',data)根据这个原则,子事务中的每一个delete操作将导致一次插入被删除的数据元素的补偿操作。函数compensationOperation可以被任何嵌入在商务逻辑中用于补偿的功能模块所替代。所述的补偿操作记录在数据库中,多个并发事务产生的补偿操作存放在同一张表中,相互之间用事务标识符加以区分,对于同一个全局事务的多个子事务,如果访问同一站点的不同服务,它们的补偿操作有可能被记录在同一个关系数据库中,因此,可以使用全局事务标识符和执行子事务的网格服务名的组合加以唯一区分。记录补偿操作的表结构如表3所示。表3记录补偿操作的表结构<table>tableseeoriginaldocumentpage17</column></row><table>所述的补偿操作与原事务的执行顺序相反。因此,在记录补偿操作时,还需要附加一个序列号,指示此补偿操作产生的先后顺序,使得后产生的补偿操作先执行,先产生的补偿操作后执行。这个序列号可以是时间戳,或是从一个序列中选择的递增的序列号。所述的产生补偿操作的行级触发器、记录补偿操作的数据库、以及递增的序列号,这些关系数据库对象均通过存储过程来创建。通过提供一个COMP一OP—PKG(补偿操作包),提供3个存储过程用于创建这3种对象,这些存储过程如表4所示。表4包C0MP_0P—PKG(补偿操作包)提供的存储过程<table>tableseeoriginaldocumentpage17</column></row><table>步骤四,自动产生补偿事务如果子事务提交成功,补偿事务产生器将产生的补偿操作封装在开始(Begin)和提交(Commit)之间,构成一个完整的事务,新产生的补偿事务被存储在数据库中,在需要时执行补偿事务;如果子事务提交失败,所有产生的补偿操作都将被放弃,当下一个事务执行时,产生的补偿操作属于另一个补偿事务。步骤五,执行补偿事务当补偿事务自动产生之后,补偿事务在用户发出撤消子事务消息或超过时限子事务仍未被确认时执行,在需要执行补偿事务时,如图2所示,首先通过url(网络地址)、username(用户名)、password(用户密码)和compOpTb(记录补偿操作的数据表名)实例化CTExecuter(补偿事务执行)类,在得到补偿事务执行类的实例后,以子事务标识符作为输入参数,调用其executeCT(执行补偿事务)方法即可执行补偿事务,执行补偿事务时需要的子事务标识符由子事务所属的全局事务的标识符以及执行子事务的网格服务名称所组成,执行补偿事务方法根据此子事务标识符,从记录补偿操作语句的表中,将补偿操作按序列号顺序取出,然后在一个事务中执行并提交。本实施例支持网格环境下补偿事务的自动产生,可以縮短和减少网格长事务应用的开发周期和工作量近50%,便于用户对事务提交结果的选择。权利要求1、一种基于网格的补偿事务自动产生方法,其特征在于,包括如下步骤首先创建针对数据修改事件产生补偿操作的行级触发器,然后由补偿事务产生器始终监视着子事务的执行;其次当影响系统状态的事件发生时,补偿事务产生器根据事件的类型调用相应的行级触发器,自动产生从语义上撤销该事件影响的补偿操作;最后,当子事务提交时,补偿事务产生器将该子事务执行过程中所产生的补偿操作组合成补偿事务,完成自动产生补偿事务。2、根据权利要求l所述的基于网格的补偿事务自动产生方法,其特征是,所述的行级触发器,是指基于数据库的触发器机制创建的针对数据修改事件而产生语义相反的补偿操作的三个存储过程模块,分别用于补偿更新、插入、删除三种语句,动态产生相应数据修改事件的补偿操作,行级触发器根据数据表中行的标识符对被修改的所有行进行补偿,不需要逐行匹配记录。3、根据权利要求1或2所述的基于网格的补偿事务自动产生方法,其特征是,所述行级触发器,其创建需要提供数据表的名字,根据名字从用户表视图中获得数据表的结构信息,包括所有字段名称以及字段的数据类型,因为数据库的USER—TAB—COLUMNS视图提供了静态数据词典视图,静态数据词典视图描述了视图的相关结构信息,每个数据表产生插入行级触发器,更新行级触发器,删除行级触发器三个存储过程模块,即三个行级触发器,它们分别用于补偿插入、更新、删除语句,三个行级触发器的输入参数都是其服务的数据表名称,当被调用时,它们产生补偿插入、更新、删除的补偿操作。4、根据权利要求1或2所述的基于网格的补偿事务自动产生方法,其特征是,所述行级触发器,当数据修改事件出现时,补偿事务产生器根据事件类型调用相应的行级触发器,行级触发器生成具体的补偿操作,补偿操作是在子事务的执行过程中动态产生的,假如子事务失败了,则在该子事务执行过程中所产生的所有补偿操作也被放弃;其动态产生数据修改事件的补偿操作具体是指在插入事件出现时,行级触发器产生相应的删除语句将插入的记录删除;在删除事件出现时,行级触发器产生相应的插入语句将删除的记录再次插入;在更新事件出现时,行级触发器将被改变的记录恢复成更新前的数据,在产生补偿操作的过程中,行级触发器通过数据表的结构信息,判断字段的数据类型;使用字符串拼接的方式,动态产生补偿操作,对于不同的数据类型,处理方式有所不同对数值型的数据,直接与补偿操作片断的字符常量连接;对字符串型的数据,则需要在这个值之前和之后,分别拼接一个单引号,作为补偿操作中字符串直接量的开始与中止符;对日期时间型的数据,需要首先将值转化为字符串,然后在产生的补偿操作中利用T(U)ATE函数将字符串值重新转换为日期时间。5、根据权利要求l所述的基于网格的补偿事务自动产生方法,其特征是,所述的补偿事务产生器,是指用于动态产生补偿事务包括三个行级触发器的模块,补偿事务产生器在子事务从开始到被确认或撤销的整个过程中,补偿事务产生器监视各种影响系统状态的事件;当影响系统状态的事件出现时,补偿事务产生器执行相应动作对于事务上下文消息,记录全局事务标识符和输入参数;预提交消息表示事务中包含的数据修改操作开始被执行,因此,补偿事务产生器开始根据子事务中数据修改操作的类型调用相应的行级触发器,自动产生数据修改事件的补偿操作,并在子事务成功提交后使用定界符将补偿操作封装成补偿事务,然后存储在数据库中;对于撤销消息,调用存储在数据库中的补偿事务;对于确认消息,删除存储在数据库中的补偿事务,网格长事务由多个子事务组成,分别由处于不同网络节点上的网格服务来完成,补偿事务产生器被安装于实际执行子事务的每一个网格服务上。6、根据权利要求l所述的基于网格的补偿事务自动产生方法,其特征是,所述的影响系统状态的事件,是指改变事务处理系统状态的各种外部操作事件,有三大类事务协调事件、数据修改事件和服务自定义事件,所述事务协调事件是指子事务从协调者收到了事务协调消息,包括事务上下文消息、预提交消息、撤销消息、确认消息,所述事务上下文消息用于协调者通知参加者事务开始、事务标识符、事务类型、协调者网络地址、事务执行有效期信息;所述预提交消息用于协调者通知参加者执行与提交子事务;所述确认和撤销消息分别用于用户确认和撤消己经提交的子事务;所述数据修改事件是指子事务中包含的改变数据库中数据的操作,数据修改操作包括插入、删除和更新;所述服务自定义事件是指网格服务提供者根据自身需要设置的特殊要求。7、根据权利要求l所述的基于网格的补偿事务自动产生方法,其特征是,所述补偿操作,其产生是由事件驱动的,根据正在执行的语句类型,以该语句为触发条件的行级触发器被补偿事务产生器所调用,动态产生另一条起抵消作用的补偿操作;所述的补偿操作记录在数据库中,多个并发事务产生的补偿操作存放在同一张表中,相互之间用事务标识符加以区分,对于同一个全局事务的多个子事务,当访问同一站点的不同服务时,它们的补偿操作在同一个记录补偿操作的数据库中,因此使用全局事务标识符和执行子事务的网格服务名的组合加以唯一区分;所述的补偿操作与原事务的执行顺序相反,在记录补偿操作时,附加一个序列号,指示此补偿操作产生的先后顺序,使得后产生的补偿操作先执行,先产生的补偿操作后执行,这个序列号是时间戳,或是从一个序列中选择的递增的序列号。8、根据权利要求7所述的基于网格的补偿事务自动产生方法,其特征是,所述产生补偿操作的行级触发器、记录补偿操作的数据库、以及递增的序列号,这些数据库对象均通过存储过程来创建,通过提供一个补偿操作包,提供3个存储过程用于创建这3种对象。9、根据权利要求l所述的基于网格的补偿事务自动产生方法,其特征是,所述自动产生补偿事务,是指如果子事务提交成功,补偿事务产生器将产生的补偿操作封装在开始和提交之间,构成一个完整的事务,新产生的补偿事务被存储在数据库中,在需要时执行补偿事务;如果子事务提交失败,所有产生的补偿操作都将被放弃,当下一个事务执行时,产生的补偿操作属于另一个补偿事务。10、根据权利要求l所述的基于网格的补偿事务自动产生方法,其特征是,当补偿事务自动产生之后,执行补偿事务,补偿事务在用户发出撤消子事务消息或超过时限子事务仍未被确认时执行,在需要执行补偿事务时,首先通过网络地址、用户名、用户密码和记录补偿操作的数据表名实例化补偿事务执行类,在得到补偿事务执行类的实例后,以子事务标识符作为输入参数,调用其执行补偿事务方法即可执行补偿事务,执行补偿事务时需要的子事务标识符由子事务所属的全局事务的标识符以及执行子事务的网格服务名称所组成,执行补偿事务方法根据此子事务标识符,从记录补偿操作语句的表中,将补偿操作按序列号顺序取出,然后在一个事务中执行并提交。全文摘要一种计算机应用领域的基于网格的补偿事务自动产生方法,首先创建针对数据修改事件产生补偿操作的行级触发器,然后由补偿事务产生器始终监视着子事务的执行;其次当影响系统状态的事件发生时,补偿事务产生器根据事件的类型调用相应的行级触发器,自动产生从语义上撤销该事件影响的补偿操作;最后,当子事务提交时,补偿事务产生器将该子事务执行过程中所产生的补偿操作组合成补偿事务,完成自动产生补偿事务。本发明的方法支持网格环境下补偿事务的自动产生,减少网格长事务应用的开发工作量和开发周期近50%。文档编号G06F17/30GK101118501SQ20071004562公开日2008年2月6日申请日期2007年9月6日优先权日2007年9月6日发明者唐飞龙,李明禄,过敏意申请人:上海交通大学