CN101118501A - 基于网格的补偿事务自动产生方法 - Google Patents
基于网格的补偿事务自动产生方法 Download PDFInfo
- Publication number
- CN101118501A CN101118501A CNA2007100456264A CN200710045626A CN101118501A CN 101118501 A CN101118501 A CN 101118501A CN A2007100456264 A CNA2007100456264 A CN A2007100456264A CN 200710045626 A CN200710045626 A CN 200710045626A CN 101118501 A CN101118501 A CN 101118501A
- Authority
- CN
- China
- Prior art keywords
- compensating
- transaction
- subtransaction
- data
- row level
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种计算机应用领域的基于网格的补偿事务自动产生方法,首先创建针对数据修改事件产生补偿操作的行级触发器,然后由补偿事务产生器始终监视着子事务的执行;其次当影响系统状态的事件发生时,补偿事务产生器根据事件的类型调用相应的行级触发器,自动产生从语义上撤销该事件影响的补偿操作;最后,当子事务提交时,补偿事务产生器将该子事务执行过程中所产生的补偿操作组合成补偿事务,完成自动产生补偿事务。本发明的方法支持网格环境下补偿事务的自动产生,减少网格长事务应用的开发工作量和开发周期近50%。
Description
技术领域
本发明涉及的是一种计算机应用技术领域的方法,具体是一种基于网格的自动产生补偿事务的方法。
背景技术
由于网络延迟和商业过程的交互,即使在没有并发事务的情况下,商业事务一般也会持续比较长的时间,因而也被称为长事务。为了减少资源被占用的时间,提高资源利用率和系统性能,组成长事务的子事务应该在全局事务结束之前提交并释放其占用的资源。如果某些子事务失败或用户需要选择提交结果时,对已提交子事务的撤销必须用执行相反任务的补偿事务来完成。
1987年Garcia-Molina等人在《Proceedings of International Conferenceon Management of Data,ACM SIGMOD Record 16(3)》(ACM SIGMOD论文集16卷第3期)上发表了“Sagas(一种长事务模型)”,该文提出了一种减少长事务资源占用时间的方法,即将长事务拆分成一组预先定义好执行顺序的子事务Ti(1≤i≤n),并为每个子事务编写一个补偿事务Ci(1≤i≤n),每个补偿事务Ci能语义地撤消由Ti的提交对系统产生的影响。该方法中,每一个子事务被允许单独提交,并立即释放其占用的资源,以提高资源的利用率。基于该模型,有不少人对此作了进一步的改进。
经对现有技术文献的检索发现,Nodine等在《Proceedings of theTwenty-Seventh Hawaii International Conference on System Sciences》(IEEE第27届Hawaii国际系统科学会议论文集)中基于Sagas的思想,提出了如何在多数据库事务中进行事务补偿,该方法通过步骤方法(step approach)将若干本地数据库集成为一个多数据库系统;每个本地数据库被封装成一组步骤(steps),每个步骤有一个关联的补偿步骤(compensating step),当事务需要补偿时,相关的补偿步骤被调用。上述方法的不足之处在于:它们要求应用开发者在编写事务性应用程序时,必须为每一个子事务提供相应的补偿事务。这样的要求难以适应网格环境,主要原因是:(1)网格服务具有自治性。服务提供者可以根据自身的商业模式设置特定的补偿要求,应用开发者在开发阶段无法知道在事务执行之前动态发现的网格服务具有哪些特殊的补偿要求。(2)大大增加了事务性网格应用的开发工作量与复杂性。与分布式数据库事务相比,网格服务涉及的操作及应用语义要复杂得多,编写补偿事务给关键性网格应用的开发带来了很大的工程量和复杂性及其困难。
发明内容
本发明的目的在于克服上述现有技术中的不足,提供一种基于网格的补偿事务自动产生方法,即在长事务执行过程中动态产生相应的补偿事务,为网格环境下透明的事务补偿提供支持,同时,用户也可以使用自动产生的补偿事务对子事务的提交结果进行选择。
本发明是通过以下技术方案实现的,本发明包括如下步骤:首先创建针对数据修改事件产生补偿操作的行级触发器,然后由补偿事务产生器始终监视着子事务的执行;其次当影响系统状态的事件发生时,补偿事务产生器根据事件的类型调用相应的行级触发器,自动产生从语义上撤销该事件影响的补偿操作;最后,当子事务提交时,补偿事务产生器将该子事务执行过程中所产生的补偿操作组合成补偿事务,完成自动产生补偿事务。
所述的行级触发器,是指:基于数据库的触发器机制创建的针对数据修改事件而产生语义相反的补偿操作的三个存储过程模块,分别用于补偿更新、插入、删除三种语句,动态产生相应数据修改事件的补偿操作。行级触发器根据数据表中行的标识符对被修改的所有行进行补偿,不需要逐行匹配记录,从而加快补偿操作的产生速度,提高系统性能。
行级触发器的工作过程具体如下:
(1)创建行级触发器
提供数据表的名字,根据名字可从用户表视图中获得数据表的结构信息,包括所有字段名称以及字段的数据类型,因为数据库的USER_TAB_COLUMNS视图提供了静态数据词典视图,静态数据词典视图描述了视图的相关结构信息,每个数据表产生create_insert_trigger(插入行级触发器),create_update_trigger(更新行级触发器),create_delete_trigger(删除行级触发器)三个存储过程模块,即三个行级触发器,它们分别用于补偿插入、更新、删除语句,三个行级触发器的输入参数都是其服务的数据表名称,当被调用时,它们产生补偿插入、更新、删除的补偿操作。
(2)行级触发器动态产生数据修改事件的补偿操作
当数据修改事件出现时,补偿事务产生器根据事件类型调用相应的行级触发器,行级触发器生成具体的补偿操作,补偿操作是在子事务的执行过程中动态产生的,假如子事务失败了,则在该子事务执行过程中所产生的所有补偿操作也被放弃,具体过程如下:在插入事件出现时,产生相应的删除语句将插入的记录删除;在删除事件出现时,产生相应的插入语句将删除的记录再次插入;在更新事件出现时,需要将被改变的记录恢复成更新前的数据。在产生补偿操作的过程中,行级触发器通过数据表的结构信息,判断字段的数据类型;使用字符串拼接的方式,动态产生补偿操作。对于不同的数据类型,处理方式有所不同:对数值型的数据,直接与补偿操作片断的字符常量连接;对字符串型的数据,则需要在这个值之前和之后,分别拼接一个单引号,作为补偿操作中字符串直接量的开始与中止符;对日期时间型的数据,需要首先将值转化为字符串,然后在产生的补偿操作中利用TO_DATE函数将字符串值重新转换为日期时间。
所述的补偿事务产生器,是指用于动态产生补偿事务包括三个行级触发器的模块。补偿事务产生器在子事务从开始到被确认或撤销的整个过程中,补偿事务产生器监视各种影响系统状态的事件;当影响系统状态的事件出现时,补偿事务产生器执行相应动作:对于事务上下文消息,记录全局事务标识符和输入参数;预提交消息表示事务中包含的数据修改操作开始被执行,因此,补偿事务产生器开始根据子事务中数据修改操作的类型调用相应的行级触发器,自动产生数据修改事件的补偿操作,并在子事务成功提交后使用定界符将补偿操作封装成补偿事务,然后存储在数据库中;对于撤销消息,调用存储在数据库中的补偿事务;对于确认消息,删除存储在数据库中的补偿事务。网格长事务由多个子事务组成,分别由处于不同网络节点上的网格服务来完成,补偿事务产生器被安装于实际执行子事务的每一个网格服务上。
所述的影响系统状态的事件,是指:改变事务处理系统状态的各种外部操作事件,有三大类:事务协调事件、数据修改事件和服务自定义事件。
所述事务协调事件是指子事务从协调者收到了事务协调消息,包括:事务上下文消息、预提交消息、撤销消息、确认消息,所述事务上下文消息用于协调者通知参加者事务开始、事务标识符、事务类型、协调者网络地址、事务执行有效期等信息;所述预提交消息用于协调者通知参加者提交;所述确认和撤销消息分别用于用户确认和撤消已经提交的子事务。
所述数据修改事件是指子事务中包含的改变数据库中数据的操作,本发明针对关系型数据库,因而数据修改操作包括:插入(insert)、删除(delete)和更新(update)。
所述服务自定义事件是指网格服务提供者根据自身需要设置的特殊要求,如对撤销订单的用户收到一定的违约金。
所述的自动产生数据修改事件的补偿操作,是指:根据数据修改的三类操作即插入、删除和更新,分别调用相应的行级触发器,产生补偿操作。必须遵循的原则是,一段时间内,一个数据库被多个并发事务访问,假设事务历史H=TiοTjοCTi,i≠j,原事务Ti所访问的数据对象被并发的依赖事务Tj所修改,补偿事务CTi只能撤销由原事务Ti本身提交所作出的所有改变,但不改变依赖事务Tj的提交结果。
所述的补偿操作记录在数据库中,多个并发事务产生的补偿操作存放在同一张表中,相互之间用事务标识符加以区分,对于同一个全局事务的多个子事务,当访问同一站点的不同服务时,它们的补偿操作在同一个记录补偿操作的数据库中,因此使用全局事务标识符和执行子事务的网格服务名的组合加以唯一区分。
所述的补偿操作与原事务的执行顺序相反,在记录补偿操作时,还需要附加一个序列号,指示此补偿操作产生的先后顺序,使得后产生的补偿操作先执行,先产生的补偿操作后执行,这个序列号是时间戳,或是从一个序列中选择的递增的序列号。
所述产生补偿操作的行级触发器、记录补偿操作的数据库、以及递增的序列号,这些数据库对象均通过存储过程来创建,通过提供一个补偿操作包,提供3个存储过程用于创建这3种对象。
所述自动产生补偿事务,是指:如果子事务提交成功,补偿事务产生器将产生的补偿操作封装在开始(Begin)和提交(Commit)之间,构成一个完整的事务,新产生的补偿事务被存储在数据库中,在需要时执行补偿事务;如果子事务提交失败,所有产生的补偿操作都将被放弃,当下一个事务执行时,产生的补偿操作属于另一个补偿事务。
与现有技术相比,本发明的方法支持网格环境下补偿事务的自动产生,可以减少网格长事务应用的开发工作量和开发周期近50%,便于用户对事务提交结果的选择,从而解决了背景技术的不足。由于在网格长事务执行过程中动态产生补偿事务,本发明可以为网格环境下的关键性应用提供透明的可靠性支持;突破自治的网格服务提供者设置特殊补偿要求的限制,这些为网格技术在商业环境的透明应用提供了技术支撑。
附图说明
图1为本发明工作原理框图;
图2为本发明执行补偿事务的类的示意图。
具体实施方式
下面结合附图对本发明的实施例作详细说明:本实施例在以本发明技术方案为前提下进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施例。
如图1所示,本实施例基于关系数据库Oracle,本实施例实现过程如下:
步骤一,创建针对数据修改事件产生补偿操作的行级触发器;
所述的行级触发器,是指:基于数据库的触发器机制创建的针对数据修改事件而产生语义相反的补偿操作的三个存储过程模块,分别用于补偿更新、插入、删除三种语句,动态产生相应数据修改事件的补偿操作。行级触发器根据数据表中行的标识符对被修改的所有行进行补偿,不需要逐行匹配记录,从而加快补偿操作的产生速度,提高系统性能。
提供数据表的名字,根据名字可从用户表视图中获得数据表的结构信息,包括所有字段名称以及字段的数据类型,因为数据库的USER_TAB_COLUMNS视图提供了静态数据词典视图,静态数据词典视图描述了视图的相关结构信息,用户表视图中部分与表结构相关的字段列在表1中。
表1USER_TAB_COLUMNS(用户表)视图中部分与表结构相关的字段
字段名称 | 数据类型 | 描述 |
TABLE_NAME | VARchar2(30) | 表或视图的名称 |
COLUMN_NAME | VARchar2(30) | 字段的名称 |
DATA_TYPE | VARchar2(30) | 字段的数据类型 |
本实施例每个数据表产生create_insert_trigger(插入行级触发器),create_update_trigger(更新行级触发器),create_delete_trigger(删除行级触发器)三个存储过程模块,即三个行级触发器,它们分别用于补偿插入、更新、删除语句,三个行级触发器的输入参数都是其服务的数据表名称,当被调用时,它们产生补偿插入、更新、删除的补偿操作。
创建行级触发器遵循以下二个原则:(1)语义上撤销原操作的影响。行级触发器按表2如示的原则产生相应的补偿操作。在表1中,opi是Ti中的操作;opj是依赖事务Tj中的相关操作。表中涉及到两种替代概念:相关替代和无关替代,相关替代指的是Ti提交后的状态Si+1是和提交前的状态Si相关的,即Si+1=f(Si,Ti),此时,copi必须消除opi的影响。例如,如果opi=update(dx,d2)并且d2=d1+n,则其补偿操作是copi=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оCTi(i≠j),Ti所访问的数据对象被并发的依赖事务Tj所修改,则补偿只能从语义上撤销事务Ti的影响,也就是说,补偿事务CTi只能撤销由原事务Ti本身提交所作出的所有改变,但不改变依赖事务Tj的提交结果。
表2行级触发器对数据修改操作的补偿原则
opi | opj | copi |
opi=update(d1, | opj=insert(d3) | copi=update(d2,d1) |
d2)replaces d1with d2 | opj=delete(d2) | copi does nothing |
opj=update(d2,d3) | 对相关替代,copi撤销opi的影响对无关替代,copi does nothing | |
opi=insert(d1) | opj=insert(d2) | copi=delete(d1) |
opj=delete(d1) | copi does nothing | |
opj=update(d1,d2) | 对相关替代,copi保持Tj的提交结果对无关替代,copi does nothing | |
opi=delete(d) | opj=update/insert/delete | copi=insert(d) |
下面是实施例中补偿删除操作的行级触发器create_delete_trigger的部分代码,各段意义如下:
·CREATE OR REPLACE PROCEDURE create_delete_trigger声明存储过程开始,其输入参数是table_name(即数据表名称)。
·EXECUTE IMMEDIATE‘...’||‘...’||...动态组装补偿操作。由于每张数据表的结构各不相同,数据表名table_name等信息只有在运行时才能获得,因此,触发器的创建有必要使用一种自动化的方式。PL/SQL语言提供的EXECUTE IMMEDIATE语句可以在运行时组装补偿操作。
·代码段第11行至14行,计算出表的列数,并存储于column_number。
·代码段第19行至28行,使用游标遍历all_tab_columns表。all_tab_columns是数据库系统存储所有表列信息的表。把table_name表的所有列名连接为字符串,并存储于column_names。
·代码段第36行至71行,CREATE OR REPLACE TRIGGERdelete_trigger_on_,创建触发器,并以表名加前缀delete_trigger_on_命名。
·代码段第47行至49行,获得当前子事务的标识符,并存储于current_sub。
·代码段第51行至54行,根据current_sub,获得当前子事务的补偿语句数。
·代码段第65行至70行,根据已获得的信息,把补偿操作存储于数据库中。
·
1 CREATE OR REPLACE PROCEDURE create_delete_trigger(2 table_name IN VARchar2)AS3 column_number INTEGER;4 column_names VARchar2(300):=”;5 column_names2 VARchar2(300):=”;6 column_name VARchar2(30);7 i INTEGER;8 TYPE cursor_type IS REF CURSOR;9 column_cursor cursor_type;10 BEGIN11 EXECUTE IMMEDIATE’SELECT COUNT(*)’12 ||’FROM all_tab_columns’13 ||’WHERE table_name=UPPER(||table_name||)’14 INTO column_number;1516 EXECUTE IMMEDIATE’ANALYZE TABLE’||table_name||’VALIDATE 17STRUCTURE’;1819 OPEN column_cursor FOR’SELECT column_name’20 ||’FROM all_tab_columns’21 ||’WHERE table_name=UPPER(||table_name||)’;22 FOR i IN 2.column_number LOOP23 FETCH column_cursor24 INTO column_name;25 column_names:=column_names||’:old.’||column_name||’,26’;27 column_names2:=column_names2||column_name||’,’;28 END LOOP;2930 FETCH column_cursor31 INTO column_name;32 column_names:=column_names||’:old.’||column_name;33 column_names2:=column_names2||column_name;34 CLOSE column_cursor;3536 EXECUTE IMMEDIATE’CREATE OR REPLACE TRIGGER delete_trigger_on_’37 ||table_name ||” |
38 ||’AFTER DELETE’39 ||’ON’||table_name ||”40 ||’FOR EACH ROW’41 ||’DECLARE’42 ||’current_sub_id INTEGER;’43 ||’current_sub_count INTEGER;’ |
44 ||’new_rowid ROWID;’4546 ||’BEGIN’47 ||’SELECT id’48 ||’INTO current_sub_id’49 ||’FROM current_sub;’5051 ||’SELECT count’52 ||’INTO current_sub_count’53 ||’FROM sub_count’54 ||’WHERE id=current_sub_id;’5556 ||’UPDATE sub_count’57 ||’SET count=count+1’58 ||’WHERE id=current_sub_id;’5960 ||’INSERT INTO comp_’||table_name||”61 ||’(’||column_names2||’)’62 ||’VALUES(’||column_names||’)’63 ||’RETURNING rowid INTO new_rowid;’6465 ||’INSERT INTO comp_op(sub_id,op_type,tab_name,old_id,66 new_id,exec_seq)’67 ||’VALUES(current_sub_id,’68 ||INSERT”,’69 ||′||table_name||,’70 ||’:old.rowid,new_rowid,current_sub_count);’71 ||’END delete_trigger;’;72 END create_delete_trigger;73/ |
步骤二,补偿事务产生器始终监视着子事务的执行过程中影响系统状态的事件,当影响系统状态的事件发生时,补偿事务产生器根据事件的类型调用相应的行级触发器;
所述的补偿事务产生器,是指用于动态产生补偿事务的模块,包括三个行级触发器。补偿事务产生器在子事务从开始到被确认或撤销的整个过程中,补偿事务产生器监视各种影响系统状态的事件;当影响系统状态的事件出现时,补偿事务产生器执行相应动作:对于事务上下文消息,记录全局事务标识符和输入参数;预提交消息表示事务中包含的数据修改操作开始被执行,因此,补偿事务产生器开始根据子事务中数据修改操作的类型调用相应的行级触发器,自动产生数据修改事件的补偿操作,并在子事务成功提交后使用定界符将补偿操作封装成补偿事务,然后存储在数据库中;对于撤销消息,调用存储在数据库中的补偿事务;对于确认消息,删除存储在数据库中的补偿事务。网格长事务由多个子事务组成,分别由处于不同网络节点上的网格服务来完成,补偿事务产生器被安装于实际执行子事务的每一个网格服务上。
所述的影响系统状态的事件,是指:改变事务处理系统状态的各种外部操作事件,有三大类:事务协调事件、数据修改事件和服务自定义事件。所述事务协调事件是指子事务从协调者收到了事务协调消息,包括:事务上下文消息、预提交消息、撤销消息、确认消息,所述事务上下文消息用于协调者通知参加者事务开始、事务标识符、事务类型、协调者网络地址、事务执行有效期等信息;所述预提交消息用于协调者通知参加者提交;所述确认和撤销消息分别用于用户确认和撤消已经提交的子事务。所述数据修改事件是指子事务中包含的改变数据库中数据的操作,本实施例针对关系型数据库,因而数据修改操作包括:插入(insert)、删除(delete)和更新(update)。所述服务自定义事件是指网格服务提供者根据自身需要设置的特殊要求,如对撤销订单的用户收到一定的违约金。
所述的行级触发器,是指:基于数据库的触发器机制创建的针对数据修改事件而产生语义相反的补偿操作的三个存储过程模块,分别用于补偿更新、插入、删除三种语句,动态产生相应数据修改事件的补偿操作。行级触发器根据数据表中行的标识符对被修改的所有行进行补偿,不需要逐行匹配记录,从而加快补偿操作的产生速度,提高系统性能。
步骤三,行级触发器动态产生补偿操作;
当数据修改事件出现时,补偿事务产生器根据事件类型调用相应的行级触发器,行级触发器生成具体的补偿操作,补偿操作是在子事务的执行过程中动态产生的,假如子事务失败了,则在该子事务执行过程中所产生的所有补偿操作也被放弃。
行级触发器在被触发时能获知被修改行的唯一标识符,这些标识符在子事务中一个操作修改多行时,可以方便地为所有被修改行产生相应的补偿操作。例如,若一条更新语句更新了两行,则在更新每行时,行级触发器都被触发一次,从而获得当前正在被更新行的唯一标识符,补偿事务产生器接收到行级触发器被触发的信息,并为该行产生一条更新补偿操作。当以插入操作为条件的行级触发器被触发时,需要把被插入行的标识符、补偿操作类型(即删除)、数据表名记录下来;当以更新操作为条件的行级触发器被触发时,则不仅要存储被更新行的标识符、补偿操作类型(即更新)、数据表名,还要建一张结构与原表相同的数据表,存储被更新行的原值,以备执行补偿时使用;当以删除操作为条件的行级触发器被触发时,不仅要存储补偿操作类型(即插入)、数据表名,还要建一张结构与原表相同的数据表,存储被删除行的原值,以备执行补偿时使用。另外,被删除行的标识符也必须存储,以备执行补偿时,查找其它补偿操作中对这个标识符的引用,并对其进行更新。
在插入事件出现时,产生相应的删除语句将插入的记录删除;在删除事件出现时,产生相应的插入语句将删除的记录再次插入;在更新事件出现时,需要将被改变的记录恢复成更新前的数据。在产生补偿操作的过程中,行级触发器通过数据表的结构信息,判断字段的数据类型;使用字符串拼接的方式,动态产生补偿操作。对于不同的数据类型,处理方式有所不同:对数值型的数据,直接与补偿操作片断的字符常量连接;对字符串型的数据,则需要在这个值之前和之后,分别拼接一个单引号,作为补偿操作中字符串直接量的开始与中止符;对日期时间型的数据,需要首先将值转化为字符串,然后在产生的补偿操作中利用TO_DATE函数将字符串值重新转换为日期时间。
所述的补偿操作,其产生是由事件驱动的,根据正在执行的语句类型,以该语句为触发条件的行级触发器被触发,产生另一条起抵消作用的补偿语句。例如,当某子事务删除一个数据元素时,删除事件产生补偿操作:
on Delete
do compensationOperation(‘Insert′,data)
根据这个原则,子事务中的每一个delete操作将导致一次插入被删除的数据元素的补偿操作。函数compensationOperation可以被任何嵌入在商务逻辑中用于补偿的功能模块所替代。
所述的补偿操作记录在数据库中,多个并发事务产生的补偿操作存放在同一张表中,相互之间用事务标识符加以区分,对于同一个全局事务的多个子事务,如果访问同一站点的不同服务,它们的补偿操作有可能被记录在同一个关系数据库中,因此,可以使用全局事务标识符和执行子事务的网格服务名的组合加以唯一区分。记录补偿操作的表结构如表3所示。
表3记录补偿操作的表结构
字段名 | 类型 | 描述 |
ORDER_NO | NUMBER | 补偿操作生成的递增序号,代表了被补偿语句的执行顺序 |
TRANS_ID | VARchar2(64) | 补偿语句所属的子事务标识符 |
SQL_STATEMENT | VARchar2(4000) | 补偿语句,以字符串的形式存放 |
所述的补偿操作与原事务的执行顺序相反。因此,在记录补偿操作时,还需要附加一个序列号,指示此补偿操作产生的先后顺序,使得后产生的补偿操作先执行,先产生的补偿操作后执行。这个序列号可以是时间戳,或是从一个序列中选择的递增的序列号。
所述的产生补偿操作的行级触发器、记录补偿操作的数据库、以及递增的序列号,这些关系数据库对象均通过存储过程来创建。通过提供一个COMP_OP_PKG(补偿操作包),提供3个存储过程用于创建这3种对象,这些存储过程如表4所示。
表4包COMP_OP_PKG(补偿操作包)提供的存储过程
存储过程名 | 参数 | 描述 |
CREATE_COMP_SEQ | 序列名称 | 创建用于产生递增序号的序列 |
CREATE_COMP_TB | 保存补偿操作的表名表空间名称 | 创建用于保存补偿操作的公共表 |
CREATE_COMP_TRI | 创建触发器的表名保存补偿操作的表名触发器名 | 创建监视目标表数据变化,并产生补偿操作的表 |
步骤四,自动产生补偿事务
如果子事务提交成功,补偿事务产生器将产生的补偿操作封装在开始(Begin)和提交(Commit)之间,构成一个完整的事务,新产生的补偿事务被存储在数据库中,在需要时执行补偿事务;如果子事务提交失败,所有产生的补偿操作都将被放弃,当下一个事务执行时,产生的补偿操作属于另一个补偿事务。
步骤五,执行补偿事务
当补偿事务自动产生之后,补偿事务在用户发出撤消子事务消息或超过时限子事务仍未被确认时执行,在需要执行补偿事务时,如图2所示,首先通过url(网络地址)、username(用户名)、password(用户密码)和compOpTb(记录补偿操作的数据表名)实例化CTExecuter(补偿事务执行)类,在得到补偿事务执行类的实例后,以子事务标识符作为输入参数,调用其executeCT(执行补偿事务)方法即可执行补偿事务,执行补偿事务时需要的子事务标识符由子事务所属的全局事务的标识符以及执行子事务的网格服务名称所组成,执行补偿事务方法根据此子事务标识符,从记录补偿操作语句的表中,将补偿操作按序列号顺序取出,然后在一个事务中执行并提交。
本实施例支持网格环境下补偿事务的自动产生,可以缩短和减少网格长事务应用的开发周期和工作量近50%,便于用户对事务提交结果的选择。
Claims (10)
1.一种基于网格的补偿事务自动产生方法,其特征在于,包括如下步骤:首先创建针对数据修改事件产生补偿操作的行级触发器,然后由补偿事务产生器始终监视着子事务的执行;其次当影响系统状态的事件发生时,补偿事务产生器根据事件的类型调用相应的行级触发器,自动产生从语义上撤销该事件影响的补偿操作;最后,当子事务提交时,补偿事务产生器将该子事务执行过程中所产生的补偿操作组合成补偿事务,完成自动产生补偿事务。
2.根据权利要求1所述的基于网格的补偿事务自动产生方法,其特征是,所述的行级触发器,是指:基于数据库的触发器机制创建的针对数据修改事件而产生语义相反的补偿操作的三个存储过程模块,分别用于补偿更新、插入、删除三种语句,动态产生相应数据修改事件的补偿操作,行级触发器根据数据表中行的标识符对被修改的所有行进行补偿,不需要逐行匹配记录。
3.根据权利要求1或2所述的基于网格的补偿事务自动产生方法,其特征是,所述行级触发器,其创建需要提供数据表的名字,根据名字从用户表视图中获得数据表的结构信息,包括所有字段名称以及字段的数据类型,因为数据库的USER_TAB_COLUMNS视图提供了静态数据词典视图,静态数据词典视图描述了视图的相关结构信息,每个数据表产生插入行级触发器,更新行级触发器,删除行级触发器三个存储过程模块,即三个行级触发器,它们分别用于补偿插入、更新、删除语句,三个行级触发器的输入参数都是其服务的数据表名称,当被调用时,它们产生补偿插入、更新、删除的补偿操作。
4.根据权利要求1或2所述的基于网格的补偿事务自动产生方法,其特征是,所述行级触发器,当数据修改事件出现时,补偿事务产生器根据事件类型调用相应的行级触发器,行级触发器生成具体的补偿操作,补偿操作是在子事务的执行过程中动态产生的,假如子事务失败了,则在该子事务执行过程中所产生的所有补偿操作也被放弃;
其动态产生数据修改事件的补偿操作具体是指:在插入事件出现时,行级触发器产生相应的删除语句将插入的记录删除;在删除事件出现时,行级触发器产生相应的插入语句将删除的记录再次插入;在更新事件出现时,行级触发器将被改变的记录恢复成更新前的数据,在产生补偿操作的过程中,行级触发器通过数据表的结构信息,判断字段的数据类型;使用字符串拼接的方式,动态产生补偿操作,对于不同的数据类型,处理方式有所不同:对数值型的数据,直接与补偿操作片断的字符常量连接;对字符串型的数据,则需要在这个值之前和之后,分别拼接一个单引号,作为补偿操作中字符串直接量的开始与中止符;对日期时间型的数据,需要首先将值转化为字符串,然后在产生的补偿操作中利用TO_DATE函数将字符串值重新转换为日期时间。
5.根据权利要求1所述的基于网格的补偿事务自动产生方法,其特征是,所述的补偿事务产生器,是指用于动态产生补偿事务包括三个行级触发器的模块,补偿事务产生器在子事务从开始到被确认或撤销的整个过程中,补偿事务产生器监视各种影响系统状态的事件;当影响系统状态的事件出现时,补偿事务产生器执行相应动作:对于事务上下文消息,记录全局事务标识符和输入参数;预提交消息表示事务中包含的数据修改操作开始被执行,因此,补偿事务产生器开始根据子事务中数据修改操作的类型调用相应的行级触发器,自动产生数据修改事件的补偿操作,并在子事务成功提交后使用定界符将补偿操作封装成补偿事务,然后存储在数据库中;对于撤销消息,调用存储在数据库中的补偿事务;对于确认消息,删除存储在数据库中的补偿事务,网格长事务由多个子事务组成,分别由处于不同网络节点上的网格服务来完成,补偿事务产生器被安装于实际执行子事务的每一个网格服务上。
6.根据权利要求1所述的基于网格的补偿事务自动产生方法,其特征是,所述的影响系统状态的事件,是指:改变事务处理系统状态的各种外部操作事件,有三大类:事务协调事件、数据修改事件和服务自定义事件,
所述事务协调事件是指子事务从协调者收到了事务协调消息,包括:事务上下文消息、预提交消息、撤销消息、确认消息,所述事务上下文消息用于协调者通知参加者事务开始、事务标识符、事务类型、协调者网络地址、事务执行有效期信息;所述预提交消息用于协调者通知参加者执行与提交子事务;所述确认和撤销消息分别用于用户确认和撤消已经提交的子事务;
所述数据修改事件是指子事务中包含的改变数据库中数据的操作,数据修改操作包括:插入、删除和更新;
所述服务自定义事件是指网格服务提供者根据自身需要设置的特殊要求。
7.根据权利要求1所述的基于网格的补偿事务自动产生方法,其特征是,所述补偿操作,其产生是由事件驱动的,根据正在执行的语句类型,以该语句为触发条件的行级触发器被补偿事务产生器所调用,动态产生另一条起抵消作用的补偿操作;所述的补偿操作记录在数据库中,多个并发事务产生的补偿操作存放在同一张表中,相互之间用事务标识符加以区分,对于同一个全局事务的多个子事务,当访问同一站点的不同服务时,它们的补偿操作在同一个记录补偿操作的数据库中,因此使用全局事务标识符和执行子事务的网格服务名的组合加以唯一区分;所述的补偿操作与原事务的执行顺序相反,在记录补偿操作时,附加一个序列号,指示此补偿操作产生的先后顺序,使得后产生的补偿操作先执行,先产生的补偿操作后执行,这个序列号是时间戳,或是从一个序列中选择的递增的序列号。
8.根据权利要求7所述的基于网格的补偿事务自动产生方法,其特征是,所述产生补偿操作的行级触发器、记录补偿操作的数据库、以及递增的序列号,这些数据库对象均通过存储过程来创建,通过提供一个补偿操作包,提供3个存储过程用于创建这3种对象。
9.根据权利要求1所述的基于网格的补偿事务自动产生方法,其特征是,所述自动产生补偿事务,是指:如果子事务提交成功,补偿事务产生器将产生的补偿操作封装在开始和提交之间,构成一个完整的事务,新产生的补偿事务被存储在数据库中,在需要时执行补偿事务;如果子事务提交失败,所有产生的补偿操作都将被放弃,当下一个事务执行时,产生的补偿操作属于另一个补偿事务。
10.根据权利要求1所述的基于网格的补偿事务自动产生方法,其特征是,当补偿事务自动产生之后,执行补偿事务,补偿事务在用户发出撤消子事务消息或超过时限子事务仍未被确认时执行,在需要执行补偿事务时,首先通过网络地址、用户名、用户密码和记录补偿操作的数据表名实例化补偿事务执行类,在得到补偿事务执行类的实例后,以子事务标识符作为输入参数,调用其执行补偿事务方法即可执行补偿事务,执行补偿事务时需要的子事务标识符由子事务所属的全局事务的标识符以及执行子事务的网格服务名称所组成,执行补偿事务方法根据此子事务标识符,从记录补偿操作语句的表中,将补偿操作按序列号顺序取出,然后在一个事务中执行并提交。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNA2007100456264A CN101118501A (zh) | 2007-09-06 | 2007-09-06 | 基于网格的补偿事务自动产生方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNA2007100456264A CN101118501A (zh) | 2007-09-06 | 2007-09-06 | 基于网格的补偿事务自动产生方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN101118501A true CN101118501A (zh) | 2008-02-06 |
Family
ID=39054632
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNA2007100456264A Pending CN101118501A (zh) | 2007-09-06 | 2007-09-06 | 基于网格的补偿事务自动产生方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101118501A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104317963A (zh) * | 2014-11-14 | 2015-01-28 | 中国建设银行股份有限公司 | 一种数据处理方法及装置 |
CN108880873A (zh) * | 2018-06-05 | 2018-11-23 | 中国农业银行股份有限公司 | 一种应用于异构系统的事务补偿方法和装置 |
-
2007
- 2007-09-06 CN CNA2007100456264A patent/CN101118501A/zh active Pending
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104317963A (zh) * | 2014-11-14 | 2015-01-28 | 中国建设银行股份有限公司 | 一种数据处理方法及装置 |
CN104317963B (zh) * | 2014-11-14 | 2017-10-24 | 中国建设银行股份有限公司 | 一种数据处理方法及装置 |
CN108880873A (zh) * | 2018-06-05 | 2018-11-23 | 中国农业银行股份有限公司 | 一种应用于异构系统的事务补偿方法和装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11176140B2 (en) | Updating a table using incremental and batch updates | |
US8825601B2 (en) | Logical data backup and rollback using incremental capture in a distributed database | |
Gousios | The GHTorent dataset and tool suite | |
US9384222B2 (en) | Database system that provides for history-enabled tables | |
CN104793988B (zh) | 跨数据库分布式事务的实现方法和装置 | |
US9830372B2 (en) | Scalable coordination aware static partitioning for database replication | |
US9298564B2 (en) | In place point-in-time recovery of pluggable databases | |
RU2413984C2 (ru) | Системы и способы манипулирования данными в системе хранения данных | |
US20190108166A1 (en) | Replicable differential store data structure | |
US20120158795A1 (en) | Entity triggers for materialized view maintenance | |
CN103026355A (zh) | 数据库管理系统 | |
CN105608086A (zh) | 分布式数据库系统的事务处理方法及装置 | |
Shukla et al. | Schema-agnostic indexing with Azure DocumentDB | |
US9171036B2 (en) | Batching heterogeneous database commands | |
CN111966692A (zh) | 针对数据仓库的数据处理方法、介质、装置和计算设备 | |
Kiepuszewski et al. | Flowback: providing backward recovery for workflow management systems | |
CN104423982A (zh) | 请求的处理方法和处理设备 | |
US11875178B2 (en) | Using multiple blockchains for applying transactions to a set of persistent data objects in persistent storage systems | |
Wei et al. | Scalable join queries in cloud data stores | |
US9542439B1 (en) | Simplified query language for accessing metadata | |
US9201685B2 (en) | Transactional cache versioning and storage in a distributed data grid | |
CN101763283A (zh) | 网格环境下的补偿事务自动产生方法 | |
US20060004812A1 (en) | Method and system for mapping datasources in a metadata model | |
CN101118501A (zh) | 基于网格的补偿事务自动产生方法 | |
US20210089615A1 (en) | Xml schema description code generator |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |