数据库、多数据库操作事务一致性保证方法及系统与流程

文档序号:11276403阅读:389来源:国知局
数据库、多数据库操作事务一致性保证方法及系统与流程

本发明涉及数据业务处理领域,更具体涉及一种数据库、多数据库操作事务一致性保证方法及系统。



背景技术:

随着lte(长期演进)流量运营时代的到来,当前boss(业务支撑系统)领域新业务层出不穷,系统性能需求呈几何级的增长,单点数据库已经很难满足业务增长的需求。数据库的拆分和异构(物理数据库、内存数据库、nosql数据库等混合使用)成了一项重要诉求,系统的功能集群化分布式处理也成了趋势。

传统常用的中间件系统如cics、tuxedo等基于xa框架2pc(两阶段提交)事务一致性保障方式因为限制太多,伸缩性的太差;boss系统在“云”化的趋势下,需要逐步剥离出核心系统,引入新的多数据库操作事务一致性保证机制成了一项重要诉求。

如图1为现有技术中数据库系统结构示意图,客户端与应用服务的应用逻辑连接,应用服务的olt适配层与数据层连接,实现对数据库的操作,其中数据库层包括物理数据库、内存数据库、数据缓存等。

但是现有技术中采用这种简单的连接池或连接代理方案,不能保证多次调用都能使用同一数据库会话(session),不能保证数据资源的透明访问(提交前的中间数据只能在同一会话session内看得到)。同时应用直接连接多个数据源,每个应用都需要考虑多数据源操作事务一致性问题,造成应用逻辑过于复杂。



技术实现要素:

本发明要解决的技术问题是如何以简单有效的方式保证对数据库的单用户或多用户的单次或多次操作的事务的一致性。

为了解决上述技术问题,本发明提供了一种多数据库操作事务一致性保证方法,所述方法包括以下步骤:

s100、第一客户端发起业务请求,第一数据服务客户端根据所述业务请求生成事务id;其中所述业务请求包括对多个数据库进行操作的多个子请求;一次所述业务请求对应一个所述事务id;

s102、所述第一数据服务客户端检查所述子请求是否有事务,对于每一个有事务的所述子请求,依次执行以下操作:

s1021、所述第一数据服务客户端根据所述事务id、对应于所述子请求的操作命令以及绑定变量形成报文信息,将所述报文信息序列化生成重做日志,之后存储所述重做日志并将所述报文信息发送给第一数据服务端;

s1022、所述第一数据服务端解析所述报文信息,并将对应的子请求放入请求队列;

s1023、所述第一数据服务端在有空闲进程时从所述请求队列获取所述子请求,连接对应的数据库,并执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第一数据服务客户端;

s103、若所有事务的所述子请求均利用所述步骤s102处理成功,则所述第一客户端向所述第一数据服务客户端发起提交请求;

s104、所述第一数据服务客户端根据所述提交请求,对于每一个处理成功的所述子请求,依次执行以下操作:

s1041、根据所述事务id获取对应的所述重做日志;

s1042、根据所述重做日志调用对应的所述第一数据服务端提交处理结果给对应的数据库,并将提交结果响应给所述第一数据服务客户端;

s1043、若接收的所有提交结果均为成功则本次业务完成,清除对应的所述事务id以及重做日志。

优选地,所述步骤s1043中,若接收的第一个所述提交结果为成功,并且存在提交结果为失败,则根据对应的所述重做日志生成错误文件,供异步平账 进程重做处理;

所述步骤s1043中,若接收的第一个所述提交结果为失败,则执行回滚处理。

优选地,所述步骤s102之后,所述方法还包括以下步骤:

若所述步骤s102的执行过程中出现异常,则执行回滚处理。

优选地,所述回滚处理包括以下步骤:

所述第一数据服务客户端向所述第一客户端反馈结果响应;

所述第一客户端向所述第一数据服务客户端发送业务回滚指令;

所述第一数据服务客户端根据所述业务回滚指令以及对应的所述事务id获取所述重做日志;

所述第一数据服务客户端根据所述重做日志,调用对应的所述第一数据服务端对已经处理过的每个所述子请求做对应的回滚操作;

所述第一数据服务客户端清空对应的所述事务id以及所述重做日志。

优选地,所述步骤s1023之后、所述步骤s103之前,所述方法还包括以下步骤:

判断当前的所述子请求是否需要事务保持,若需要事务保持,则当前进程只能分配给具有相同的所述事务id的请求使用,若不需要事务保持,则释放当前进程。

优选地,所述第一客户端发起新的业务请求时,所述方法还包括以下步骤:

s105、所述第一数据服务客户端判断该业务请求是否是对于某一数据库的第一次业务请求,若不是第一次业务请求,则所述第一数据服务客户端将所述新的业务请求的事务id设置为与前一次业务请求的事务id;

s106、所述第一数据服务客户端根据所述新的业务请求的事务id、对应的操作命令以及绑定变量形成报文信息,之后将所述报文信息发送给第一数据服务端;

s107、所述第一数据服务端解析所述报文信息,并将对应的请求放入请求队列;

s108、所述第一数据服务端判断是否存在所述新的业务请求的事务id的 独占进程,若存在,则从所述请求队列获取所述请求,连接对应的数据库,利用所述独占进程执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第一数据服务客户端;所述第一数据服务客户端将所述处理结果响应给所述第一客户端;

s109、所述第一客户端向所述第一数据服务客户端发起提交请求;所述第一数据服务客户端将所述提交请求的事务id设置为前一次业务请求的事务id,并且所述第一数据服务客户端根据所述提交请求生成报文信息发送给对应的所述第一数据服务端;

s110、所述第一数据服务端根据接收的步骤s109中的所述报文信息,连接对应的数据库,并判断是否存在所述提交请求的事务id的独占进程,若存在,利用所述独占进程执行提交操作,并在提交完成后向所述第一数据服务客户端饭反馈提交响应,所述第一数据服务客户端根据所述提交响应向所述第一客户端反馈对应的提交结果。

一种数据库操作事务一致性保证方法,所述方法包括以下步骤:

s200、第二客户端的向第二数据服务客户端发起业务请求,所述第二数据服务客户端根据所述业务请求生成事务id;

s201、所述第二数据服务客户端调用所述第三数据服务客户端,并且所述第三数据服务客户端产生与所述第二数据服务客户端所产生的事务id相同的事务id;

s202、所述第三数据服务客户端根据所述事务id、对应的操作命令以及绑定变量形成报文信息,并将所述报文信息发送给第二数据服务端;

s203、所述第二数据服务端解析所述报文信息,并将业务请求放入请求队列;

s204、所述第二数据服务端在有空闲进程时从所述请求队列获取所述业务请求,连接对应的数据库,并执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第三数据服务客户端;

s205、判断当前的业务请求是否需要事务保持,若需要事务保持,则当前进程只能分配给具有相同的所述事务id的请求使用,若不需要事务保持,则 释放当前进程;

s206、所述第三客户端发起第三次业务请求时,所述第三数据服务客户端产生与上一次业务请求所产生的事务id相同事务id;

s207、所述第三数据服务客户端根据所述事务id、对应的操作命令以及绑定变量形成报文信息,之后将所述报文信息发送给第二数据服务端;

s208、所述第二数据服务端解析所述报文信息,并将对应的请求放入请求队列;

s209、所述第二数据服务端判断是否存在所述事务id的独占进程,若存在,则从所述请求队列获取对应的业务请求,连接对应的数据库,利用所述独占进程执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第三数据服务客户端;所述第三数据服务客户端将所述处理结果响应给所述第二数据服务客户端;

s2010、第二客户端的向第二数据服务客户端发起第二次业务请求,所述第二数据服务客户端产生与上一次业务请求所产生的事务id相同事务id;

s2011、所述第二数据服务客户端根据所述事务id、对应的操作命令以及绑定变量形成报文信息,之后将所述报文信息发送给第二数据服务端;

s2012、所述第二数据服务端解析所述报文信息,并将对应的请求放入请求队列;

s2013、所述第二数据服务端判断是否存在所述事务id的独占进程,若存在,则从所述请求队列获取对应的业务请求,连接对应的数据库,利用所述独占进程执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第三数据服务客户端;所述第三数据服务客户端将所述处理结果响应给所述第二数据服务客户端;

s2014、对于同一数据库的业务完成之后,所述第二客户端向所述第二数据服务客户端发起提交请求;所述第二数据服务客户端将所述提交请求的事务id设置为前一次业务请求的事务id;并向所述第三数据服务客户端发起请求;

所述第三数据服务客户端判断当前提交请求是否为自己发出的请求,若不 是,则所述第三数据服务客户端发聩预定响应给所述第二数据服务客户端,所述第二数据服务客户端收到所述预定响应后,根据所述提交请求生成报文信息发送给对应的所述第二数据服务端;

s2015、所述第二数据服务端根据接收的步骤s2014中的所述报文信息,连接对应的数据库,并判断是否存在所述事务id的独占进程,若存在,利用所述独占进程执行提交操作,并在提交完成后向所述第二数据服务客户端饭反馈提交响应。

一种利用上述多数据库操作事务一致性保证方法保证多数据库操作事务一致性的系统,所述系统包括第一客户端、若干个数据库、第一数据服务客户端以及第一数据服务端;

所述第一客户端用于向所述第一数据服务客户端发起业务请求;

所述第一数据服务客户端用于根据所述业务请求生成事务id;其中所述业务请求包括对多个数据库进行操作的多个子请求;一次所述业务请求对应一个所述事务id;

所述第一数据服务客户端还用于检查所述子请求是否有事务,对于每一个有事务的所述子请求,所述第一数据服务客户端还用于根据所述事务id、对应于所述子请求的操作命令以及绑定变量形成报文信息,将所述报文信息序列化生成重做日志,之后存储所述重做日志并将所述报文信息发送给所述第一数据服务端;

所述第一数据服务端用于解析所述报文信息,并将对应的子请求放入请求队列,并且在有空闲进程时,所述第一数据服务端还用于从所述请求队列获取所述子请求,连接对应的数据库,并执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第一数据服务客户端;在所有事务的所述子请求均处理成功,则所述第一客户端还用于向所述第一数据服务客户端发起提交请求;对于每一个处理成功的所述子请求,所述第一数据服务客户端还用于根据所述提交请求以及所述事务id获取对应的所述重做日志,之后根据所述重做日志调用对应的所述第一数据服务端提交处理结果给对应的数据库,并将提交结果响应给所述第一数据服务客户端;在所有提交结果均为成功则本次业务完 成,所述第一数据服务客户端还用于清除对应的所述事务id以及重做日志。

优选地,在所述第一数据服务客户端接收的第一个所述提交结果为成功,并且存在提交结果为失败,则所述第一数据服务客户端还用于根据对应的所述重做日志生成错误文件,供异步平账进程重做处理;

至少一个所述子请求在执行对应的所述操作命令时出现异常时,所述第一数据服务客户端和所述第一数据服务端执行回滚操作。

一种利用上述数据库操作事务一致性保证方法保证数据库操作事务一致性的系统,所述系统包括第二客户端、第二数据服务客户端、第三数据服务客户端以及第二数据服务端;

所述第二客户端用于向所述第二数据服务客户端发起业务请求,所述第二数据服务客户端用于根据所述业务请求生成事务id;所述第二数据服务客户端还用于调用所述第三数据服务客户端,并且所述第三数据服务客户端用于产生第一次业务请求,并根据所述业务请求产生与所述第二数据服务客户端所产生的事务id相同的事务id;

所述第三数据服务客户端还用于根据所述事务id、对应的操作命令以及绑定变量形成报文信息,并将所述报文信息发送给第二数据服务端;

所述第二数据服务端用于解析所述报文信息,并将业务请求放入请求队列,并且在有空闲进程时,所述第二数据服务端还用于从请求队列获取所述业务请求,连接对应的数据库,并执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第三数据服务客户端;

所述第三数据服务客户端还用于判断当前的业务请求是否需要事务保持,若需要事务保持,则所述第三数据服务客户端将当前进程只分配给具有相同的所述事务id的请求使用,若不需要事务保持,则释放当前进程;

所述第三客户端还用于发起第二次业务请求,此时所述第三数据服务客户端还用于产生与上一次业务请求所产生的事务id相同事务id,并且根据所述事务id、对应的操作命令以及绑定变量形成报文信息,之后将所述报文信息发送给第二数据服务端;所述第二数据服务端还用于解析所述报文信息,将对应的请求放入请求队列,并且判断是否存在所述事务id的独占进程,若存在, 则从所述请求队列获取对应的业务请求,连接对应的数据库,利用所述独占进程执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第三数据服务客户端;所述第三数据服务客户端还用于将所述处理结果响应给所述第二数据服务客户端;

所述第二客户端向第二数据服务客户端发起第二次业务请求时,所述第二数据服务客户端还用于产生与上一次业务请求所产生的事务id相同事务id,并且根据所述事务id、对应的操作命令以及绑定变量形成报文信息,之后将所述报文信息发送给第二数据服务端,所述第二数据服务端还用于解析所述报文信息,将对应的请求放入请求队列,并判断是否存在所述事务id的独占进程,若存在,则从所述请求队列获取对应的业务请求,连接对应的数据库,利用所述独占进程执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第三数据服务客户端;所述第三数据服务客户端还用于将所述处理结果响应给所述第二数据服务客户端;

对同一数据库的业务完成之后,所述第二客户端还用于向所述第二数据服务客户端发起提交请求;所述第二数据服务客户端还用于将所述提交请求的事务id设置为前一次业务请求的事务id;并向所述第三数据服务客户端发起请求;所述第三数据服务客户端还用于判断当前提交请求是否为自己发出的请求,若不是,则所述第三数据服务客户端发聩预定响应给所述第二数据服务客户端,所述第二数据服务客户端收到所述预定响应后,还用于根据所述提交请求生成报文信息发送给对应的所述第二数据服务端;所述第二数据服务端还用于根据接收的所述报文信息,连接对应的数据库,并判断是否存在所述事务id的独占进程,若存在,利用所述独占进程执行提交操作,并在提交完成后向所述第二数据服务客户端饭反馈提交响应。

本发明提供了一种数据库、多数据库操作事务一致性保证方法及系统,本发明为具有事务的业务请求生成事务id和重放日志,将重放日志进行存储,并将该业务请求发送给数据服务客户端,由数据服务端完成相应的操作,并将结果反馈给数据服务客户端。在处理过程中若出现异常则根据事务id将对应于这次业务请求的所有操作全部回滚,若对应于这次业务请求的所有操作全部 完成,则根据对应的重放日志进行提交,在提交过程中若出现异常则进行回滚处理或异常处理,提交完毕相应的数据库更新完毕,本发明保证了多数据库操作的事务一致性。多个用户多次对数据库进行操作时,数据服务端对各个业务请求是否需要进行业务保持进行记录,并为需要业务保持的请求分配独占进程,该独占进程只分配给特定事务id的请求使用,从而通过事务id的设置在多用户多次操作数据库以及提交时能够保证事务的一致性。本发明支持对多个数据操作且能保证事务一致性,简化应用开发的复杂度;同时本发明支持对dml操作的回滚和重做(redo),应用层不用处理路由管理和事务管理,从而简化应用,降低开发成本。另外,本发明支持跨服务的数据库连接会话重入,确保一个业务事务中,多个服务进程(或线程)对同一数据的多次修改后脏数据(未做提交中间数据)各个进程(或线程)透明可见。

附图说明

图1为现有技术中数据库系统结构示意图;

图2为本发明的多数据库操作事务一致性保证方法的流程图;

图3为本发明的数据库操作事务一致性保证方法的流程图;

图4为本发明的保证多数据库操作事务一致性的系统结构示意图;

图5为本发明的一个较佳实施例一的保证多数据库操作事务一致性的系统结构示意图;

图6为本发明的一个较佳实施例二的多数据库操作事务一致性保证方法的流程图;

图7为本发明的一个较佳实施例二中回滚处理的流程图;

图8为本发明的一个较佳实施例二中异常处理的流程图;

图9为本发明的一个较佳实施例三的保证多数据库操作事务一致性的系统的结构示意图;

图10为本发明的一个较佳实施例四的保证多数据库操作事务一致性的方法流程图;

图11为本发明的一个较佳实施例五的保证数据库操作事务一致性的系统 的结构示意图;

图12为本发明的一个较佳实施例六的保证数据库操作事务一致性的方法流程图。

具体实施方式

下面结合附图和实施例对本发明作进一步详细描述。以下实施例用于说明发明,但不能用来限制本发明的范围。

一种多数据库操作事务一致性保证方法,如图2所示,所述方法包括以下步骤:

s100、第一客户端发起业务请求,第一数据服务客户端根据所述业务请求生成事务id;其中所述业务请求包括对多个数据库进行操作的多个子请求;一次所述业务请求对应一个所述事务id;

s102、所述第一数据服务客户端检查所述子请求是否有事务,对于每一个有事务的所述子请求,执行对应的所述操作命令,获得处理结果,具体地:

s1021、所述第一数据服务客户端根据所述事务id、对应于所述子请求的操作命令以及绑定变量形成报文信息,将所述报文信息序列化生成重做日志,之后存储所述重做日志并将所述报文信息发送给第一数据服务端;

s1022、所述第一数据服务端解析所述报文信息,并将对应的子请求放入请求队列;

s1023、所述第一数据服务端在有空闲进程时从所述请求队列获取所述子请求,连接对应的数据库,并执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第一数据服务客户端;

其中第一数据服务端有若干个,根据子请求的需求有对应的服务端执行对应的所述操作命令;

s103、若所有事务的所述子请求均利用所述步骤s102处理成功,则所述第一客户端向所述第一数据服务客户端发起提交请求;

s104、所述第一数据服务客户端根据所述提交请求,进行提交操作,具体地对于每一个处理成功的所述子请求,依次执行以下操作:

s1041、根据所述事务id获取对应的所述重做日志;

s1042、根据所述重做日志调用对应的所述第一数据服务端提交处理结果给对应的数据库,并将提交结果响应给所述第一数据服务客户端;

s1043、若接收的所有提交结果均为成功则本次业务完成,清除对应的所述事务id以及重做日志。

上述方法保证了多数据库操作的事务一致性。

进一步地,所述步骤s1043中,若接收的第一个所述提交结果为成功,并且存在提交结果为失败,则根据对应的所述重做日志生成错误文件,供异步平账进程重做处理;

所述步骤s1043中,若接收的第一个所述提交结果为失败,则执行回滚处理。

进一步地,所述步骤s102之后,所述方法还包括以下步骤:

若所述步骤s102的执行过程中出现异常,则执行回滚处理。

进一步地,所述回滚处理包括以下步骤:

所述第一数据服务客户端向所述第一客户端反馈结果响应;

所述第一客户端向所述第一数据服务客户端发送业务回滚指令;

所述第一数据服务客户端根据所述业务回滚指令以及对应的所述事务id获取所述重做日志;

所述第一数据服务客户端根据所述重做日志,调用对应的所述第一数据服务端对已经处理过的每个所述子请求做对应的回滚操作;

所述第一数据服务客户端清空对应的所述事务id以及所述重做日志。

进一步地,所述步骤s1023之后、所述步骤s103之前,所述方法还包括以下步骤:

判断当前的所述子请求是否需要事务保持,若需要事务保持,则当前进程只能分配给具有相同的所述事务id的请求使用,若不需要事务保持,则释放当前进程。

进一步地,所述第一客户端发起新的业务请求时,所述方法还包括以下步骤:

s105、所述第一数据服务客户端判断该业务请求是否是对于某一数据库的第一次业务请求,若不是第一次业务请求,则所述第一数据服务客户端将所述新的业务请求的事务id设置为与前一次业务请求的事务id;

s106、所述第一数据服务客户端根据所述新的业务请求的事务id、对应的操作命令以及绑定变量形成报文信息,之后将所述报文信息发送给第一数据服务端;

s107、所述第一数据服务端解析所述报文信息,并将对应的请求放入请求队列;

s108、所述第一数据服务端判断是否存在所述新的业务请求的事务id的独占进程,若存在,则从所述请求队列获取所述请求,连接对应的数据库,利用所述独占进程执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第一数据服务客户端;所述第一数据服务客户端将所述处理结果响应给所述第一客户端;

s109、所述第一客户端向所述第一数据服务客户端发起提交请求;所述第一数据服务客户端将所述提交请求的事务id设置为前一次业务请求的事务id,并且所述第一数据服务客户端根据所述提交请求生成报文信息发送给对应的所述第一数据服务端;

s110、所述第一数据服务端根据接收的步骤s109中的所述报文信息,连接对应的数据库,并判断是否存在所述提交请求的事务id的独占进程,若存在,利用所述独占进程执行提交操作,并在提交完成后向所述第一数据服务客户端饭反馈提交响应,所述第一数据服务客户端根据所述提交响应向所述第一客户端反馈对应的提交结果。

本发明还公开了一种数据库操作事务一致性保证方法,如图2所示,所述方法包括以下步骤:

s200、第二客户端的向第二数据服务客户端发起业务请求,所述第二数据服务客户端根据所述业务请求生成事务id;

s201、所述第二数据服务客户端调用所述第三数据服务客户端,并且所述第三数据服务客户端产生与所述第二数据服务客户端所产生的事务id相同的 事务id;

s202、所述第三数据服务客户端根据所述事务id、对应的操作命令以及绑定变量形成报文信息,并将所述报文信息发送给第二数据服务端;

s203、所述第二数据服务端解析所述报文信息,并将业务请求放入请求队列;

s204、所述第二数据服务端在有空闲进程时从所述请求队列获取所述业务请求,连接对应的数据库,并执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第三数据服务客户端;

s205、判断当前的业务请求是否需要事务保持,若需要事务保持,则当前进程只能分配给具有相同的所述事务id的请求使用,若不需要事务保持,则释放当前进程;

s206、所述第三客户端发起第三次业务请求时,所述第三数据服务客户端产生与上一次业务请求所产生的事务id相同事务id;

s207、所述第三数据服务客户端根据所述事务id、对应的操作命令以及绑定变量形成报文信息,之后将所述报文信息发送给第二数据服务端;

s208、所述第二数据服务端解析所述报文信息,并将对应的请求放入请求队列;

s209、所述第二数据服务端判断是否存在所述事务id的独占进程,若存在,则从所述请求队列获取对应的业务请求,连接对应的数据库,利用所述独占进程执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第三数据服务客户端;所述第三数据服务客户端将所述处理结果响应给所述第二数据服务客户端;

s2010、第二客户端的向第二数据服务客户端发起第二次业务请求,所述第二数据服务客户端产生与上一次业务请求所产生的事务id相同事务id;

s2011、所述第二数据服务客户端根据所述事务id、对应的操作命令以及绑定变量形成报文信息,之后将所述报文信息发送给第二数据服务端;

s2012、所述第二数据服务端解析所述报文信息,并将对应的请求放入请求队列;

s2013、所述第二数据服务端判断是否存在所述事务id的独占进程,若存在,则从所述请求队列获取对应的业务请求,连接对应的数据库,利用所述独占进程执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第三数据服务客户端;所述第三数据服务客户端将所述处理结果响应给所述第二数据服务客户端;

s2014、对于同一数据库的业务完成之后,所述第二客户端向所述第二数据服务客户端发起提交请求;所述第二数据服务客户端将所述提交请求的事务id设置为前一次业务请求的事务id;并向所述第三数据服务客户端发起请求;

所述第三数据服务客户端判断当前提交请求是否为自己发出的请求,若不是,则所述第三数据服务客户端发送预定响应给所述第二数据服务客户端,所述第二数据服务客户端收到所述预定响应后,根据所述提交请求生成报文信息发送给对应的所述第二数据服务端;

s2015、所述第二数据服务端根据接收的步骤s2014中的所述报文信息,连接对应的数据库,并判断是否存在所述事务id的独占进程,若存在,利用所述独占进程执行提交操作,并在提交完成后向所述第二数据服务客户端饭反馈提交响应。

一种利用上述多数据库操作事务一致性保证方法保证多数据库操作事务一致性的系统,所述系统包括第一客户端、若干个数据库、第一数据服务客户端以及第一数据服务端;所述第一客户端用于向所述第一数据服务客户端发起业务请求;所述第一数据服务客户端用于根据所述业务请求生成事务id;其中所述业务请求包括对多个数据库进行操作的多个子请求;一次所述业务请求对应一个所述事务id;所述第一数据服务客户端还用于检查所述子请求是否有事务,对于每一个有事务的所述子请求,所述第一数据服务客户端还用于根据所述事务id、对应于所述子请求的操作命令以及绑定变量形成报文信息,将所述报文信息序列化生成重做日志,之后存储所述重做日志并将所述报文信息发送给所述第一数据服务端;所述第一数据服务端用于解析所述报文信息,并将对应的子请求放入请求队列,并且在有空闲进程时,所述第一数据服务端 还用于从所述请求队列获取所述子请求,连接对应的数据库,并执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第一数据服务客户端;在所有事务的所述子请求均处理成功,则所述第一客户端还用于向所述第一数据服务客户端发起提交请求;对于每一个处理成功的所述子请求,所述第一数据服务客户端还用于根据所述提交请求以及所述事务id获取对应的所述重做日志,之后根据所述重做日志调用对应的所述第一数据服务端提交处理结果给对应的数据库,并将提交结果响应给所述第一数据服务客户端;在所有提交结果均为成功则本次业务完成,所述第一数据服务客户端还用于清除对应的所述事务id以及重做日志。

如图4所示,上述第一数据服务客户端,即数据服务(客户端)以及所述第一数据服务端,即数据服务(服务端)位于数据访问层,多个应用位于应用层,数据库层包括若干个内存数据库、物理数据库等。

图4中,应用层用于实现具体业务功能,通过数据访问层(dal)统一访问数据源。应用层通过数据服务和数据库打交道,从而简化应用的逻辑。数据访问层(dal)由数据服务(客户端)和数据服务(服务端)两部分组成,数据服务(客户端)以连接库(lib)形式和应用集成到一起,数据服务(客户端)通过数据服务(服务端)统一和数据库进行交互;数据访问层统一提供路由管理、事务管理、dml语句执行等处理。数据层将所有的数据库(物理数据库、内存数据库、nosql数据库等)统一纳入数据层,通过数据访问层统一和数据库进行连接管理和数据交互。

进一步地,在所述第一数据服务客户端接收的第一个所述提交结果为成功,并且存在提交结果为失败,则所述第一数据服务客户端还用于根据对应的所述重做日志生成错误文件,供异步平账进程重做处理;

至少一个所述子请求在执行对应的所述操作命令时出现异常时,所述第一数据服务客户端和所述第一数据服务端执行回滚操作。

一种上述数据库操作事务一致性保证方法保证数据库操作事务一致性的系统,所述系统包括第二客户端、第二数据服务客户端、第三数据服务客户端以及第二数据服务端;所述第二客户端用于向所述第二数据服务客户端发起业 务请求,所述第二数据服务客户端用于根据所述业务请求生成事务id;所述第二数据服务客户端还用于调用所述第三数据服务客户端,并且所述第三数据服务客户端用于产生第一次业务请求,并根据所述业务请求产生与所述第二数据服务客户端所产生的事务id相同的事务id;所述第三数据服务客户端还用于根据所述事务id、对应的操作命令以及绑定变量形成报文信息,并将所述报文信息发送给第二数据服务端;所述第二数据服务端用于解析所述报文信息,并将业务请求放入请求队列,并且在有空闲进程时,所述第二数据服务端还用于从请求队列获取所述业务请求,连接对应的数据库,并执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第三数据服务客户端;所述第三数据服务客户端还用于判断当前的业务请求是否需要事务保持,若需要事务保持,则所述第三数据服务客户端将当前进程只分配给具有相同的所述事务id的请求使用,若不需要事务保持,则释放当前进程;所述第三客户端还用于发起第二次业务请求,此时所述第三数据服务客户端还用于产生与上一次业务请求所产生的事务id相同事务id,并且根据所述事务id、对应的操作命令以及绑定变量形成报文信息,之后将所述报文信息发送给第二数据服务端;所述第二数据服务端还用于解析所述报文信息,将对应的请求放入请求队列,并且判断是否存在所述事务id的独占进程,若存在,则从所述请求队列获取对应的业务请求,连接对应的数据库,利用所述独占进程执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第三数据服务客户端;所述第三数据服务客户端还用于将所述处理结果响应给所述第二数据服务客户端;所述第二客户端向第二数据服务客户端发起第二次业务请求时,所述第二数据服务客户端还用于产生与上一次业务请求所产生的事务id相同事务id,并且根据所述事务id、对应的操作命令以及绑定变量形成报文信息,之后将所述报文信息发送给第二数据服务端,所述第二数据服务端还用于解析所述报文信息,将对应的请求放入请求队列,并判断是否存在所述事务id的独占进程,若存在,则从所述请求队列获取对应的业务请求,连接对应的数据库,利用所述独占进程执行对应的所述操作命令,获得处理结果,并将所述处理结果响应给所述第三数据服务客户端;所述第三数据服务客户端还用于将所述处 理结果响应给所述第二数据服务客户端;对同一数据库的业务完成之后,所述第二客户端还用于向所述第二数据服务客户端发起提交请求;所述第二数据服务客户端还用于将所述提交请求的事务id设置为前一次业务请求的事务id;并向所述第三数据服务客户端发起请求;所述第三数据服务客户端还用于判断当前提交请求是否为自己发出的请求,若不是,则所述第三数据服务客户端发聩预定响应给所述第二数据服务客户端,所述第二数据服务客户端收到所述预定响应后,还用于根据所述提交请求生成报文信息发送给对应的所述第二数据服务端;所述第二数据服务端还用于根据接收的所述报文信息,连接对应的数据库,并判断是否存在所述事务id的独占进程,若存在,利用所述独占进程执行提交操作,并在提交完成后向所述第二数据服务客户端饭反馈提交响应。

下面通过几个实施例对本发明进行详细的介绍。

图5为本发明的一个较佳实施例一的保证多数据库操作事务一致性的系统结构示意图。此实施例用于实现对多个数据库进行一致性操作。此实施例的工作流程如下:

1、客户端发起业务请求,数据服务(客户端)负责生成总事务id,一次事务只生成一次事务只生成一个事务id且保证全系统唯一;

2、对于有事务操作的dml请求(update、insert、delete等),数据服务(客户端)将报文信息(事务id、dml语句、绑定变量等)利用序列化工具进行序列化,序列化后的信息称重做(redo)日志,将重做(redo)日志缓存在本地内存缓冲区;对于无事务的请求(如select)不生成redo日志;

3、数据服务(客户端)将请求报文(事务id、dml语句、绑定变量等)封装打包后,发送给数据服务(dataservice)服务端;

4、数据服务(服务端)接收请求信息后,将报文反序列化,放入报文容器内,执行该报文的dml语句,并将处理结果响应给数据服务(服务端),注意此时不自动提交(commit),需要等数据服务(客户端)对该事务id发起提交请求才成做提交处理;

5、根据业务需要,数据服务(客户端)可多次调用不同的数据服务(服 务端),重复步骤2、步骤3和步骤4,直到业务完成;

6、只有所有数据服务处理成功,才能执行下一步的提交操作,否则失败回滚;

7、业务成功,数据服务(客户端)根据本地内存缓冲区记录的重做(redo)日志,依次对数据服务(服务端)发起提交请求;数据服务(服务端)接收到提交请求后,记录该事务id对应的事务日志(目的是当客户端不确认成功重做时,用来做排重处理的,对于有记录的表示已处理成功不需要重做,对于没有记录的,需要重做处理)和本事务id对应的其他dml操作,一块提交确认,响应给数据服务(客户端),提交成功后响应成功,提交失败响应失败。

8、如果第一个提交的数据服务(服务端)响应失败,数据服务(客户端)放弃该业务回滚处理;

9、如果第一个提交的数据服务(服务端)响应成功,其他后续的提交的数据服务(服务端)存在不确认成功,数据服务(客户端)将本地内存缓冲区记录的重做(redo)日志生成错误文件,对外响应成功,不确认成功的操作,后续靠异步程序进行redo平账处理;

如果所有数据服务(服务端)响应成功,数据服务(客户端)清理该事务id对应的本地内存缓冲区记录的重做(redo);下次业务,重新生成一个事务id,重复以上操作。

图6为本发明的一个较佳实施例二的多数据库操作事务一致性保证方法的流程图;如图所示,该实施例包括以下步骤:

1、应用app,即客户端接收(或发起)dml(如select查询)请求,通过api接口传递数据服务(客户端lib);

2、数据服务(客户端lib)设置事务id,并将dml请求1的sql语句及相关绑定变量装入发送容器;

3、检查该dml请求1是否有事务,有事务则将请求报文序列化文件写入内存缓冲区,生成重做(redo)日志;

4、数据服务(客户端lib)与数据服务(服务端)建立socket套接字连接,通过socket接口将请求报文发送给数据服务(服务端);数据服务(客户端 lib)保持该socket连接,等待服务端返回应答信息;

5、数据服务(服务端)端将请求放入请求队列排队;

6、当有空闲的处理进程时,调度空闲进程处理处理该任务;如果没有空闲进程,该请求排队等待;在此过程中,如果有其他应用app发起socket接入和dml请求,采用相同处理,将请求放入队列排队;

7、空闲处理进程从请求队列中获取请求任务,获取数据库连接,执行dml((如select查询))语句,得到处理结果,将处理结果装入服务端发送容器;

8、数据服务(服务端)将本端发送容器序列化,找到响应请求包的socket套接字连接,将处理结果响应给数据服务(客户端lib);

9、数据服务(客户端lib)根据业务需求,对dml请求n重复执行以上步骤2到步骤8的操作,直到所有dml请求都获得执行处理;

10、业务完成,应用app发起提交处理,数据服务(客户端lib)按事务id从内存缓冲区,读取redo日志;

11、数据服务(客户端lib)调用数据服务(服务端)进行提交处理;数据服务(服务端)按事务id调用进行提交处理;

12、数据服务(客户端lib)重复执行步骤11,提交所有事务的数据服务(服务端);

13、提交成功,处理结束。

图7为本发明的一个较佳实施例二中回滚处理的流程图,该实施例包括以下步骤:

1、应用app接收(或发起)dml(如select查询)请求,通过api接口传递数据服务(客户端lib);

2、数据服务(客户端lib)设置事务id,并将dml请求1的sql语句及相关绑定变量装入发送容器;

3、检查该dml请求1是否有事务,有事务则将请求报文序列化文件写入内存缓冲区,生成重做(redo)日志;

4、数据服务(客户端lib)与数据服务(服务端)建立socket套接字连接, 通过socket接口将请求报文发送给数据服务(服务端);数据服务(客户端lib)保持该socket连接,等待服务端返回应答信息;

5、数据服务(服务端)端将请求放入请求队列排队;

6、当有空闲的处理进程时,调度空闲进程处理处理该任务;如果没有空闲进程,该请求排队等待;在此过程中,如果有其他应用app发起socket接入和dml请求,采用相同处理,将请求放入队列排队;

7、空闲处理进程从请求队列中获取请求任务,获取数据库连接,执行dml((如select查询))语句,得到处理结果,将处理结果装入服务端发送容器;

8、数据服务(服务端)将本端发送容器序列化,找到响应请求包的socket套接字连接,将处理结果响应给数据服务(客户端lib);

9、数据服务(客户端lib)根据业务需求,对dml请求n重复执行以上步骤2到步骤8的操作,直到所有dml请求都获得执行处理;

10、如果其中一个dml请求n处理失败,则认为业务处理失败;

11、应用app发起回滚处理,数据服务(客户端lib)按事务id从内存缓冲区,读取redo日志;

12、数据服务(客户端lib)调用数据服务(服务端)进行回滚处理;数据服务(服务端)按事务id调用进行回滚处理;

13、数据服务(客户端lib)重复执行步骤11,回滚所有事务的数据服务(服务端);

14、回滚成功,处理结束。

图8为本发明的一个较佳实施例二中异常处理的流程图,该实施例包括以下步骤:

1、应用app接收(或发起)dml(如select查询)请求,通过api接口传递数据服务(客户端lib);

2、数据服务(客户端lib)设置事务id,并将dml请求1的sql语句及相关绑定变量装入发送容器;

3、检查该dml请求1是否有事务,有事务则将请求报文序列化文件写 入内存缓冲区,生成重做(redo)日志;

4、数据服务(客户端lib)与数据服务(服务端)建立socket套接字连接,通过socket接口将请求报文发送给数据服务(服务端);数据服务(客户端lib)保持该socket连接,等待服务端返回应答信息;

5、数据服务(服务端)端将请求放入请求队列排队;

6、当有空闲的处理进程时,调度空闲进程处理处理该任务;如果没有空闲进程,该请求排队等待;在此过程中,如果有其他应用app发起socket接入和dml请求,采用相同处理,将请求放入队列排队;

7、空闲处理进程从请求队列中获取请求任务,获取数据库连接,执行dml((如select查询))语句,得到处理结果,将处理结果装入服务端发送容器;

8、数据服务(服务端)将本端发送容器序列化,找到响应请求包的socket套接字连接,将处理结果响应给数据服务(客户端lib);

9、数据服务(客户端lib)根据业务需求,对dml请求n重复执行以上步骤2到步骤8的操作,直到所有dml请求都获得执行处理;

10、业务完成,应用app发起提交处理,数据服务(客户端lib)按事务id从内存缓冲区,读取redo日志;

11、数据服务(客户端lib)调用数据服务(服务端)进行提交处理;数据服务(服务端)按事务id调用进行提交处理;

12、数据服务(客户端lib)重复执行步骤11,提交所有事务的数据服务(服务端);

13、如果第一个数据服务(服务端)提交成功,第2~n(n代表最后一个)个中任何一个数据服务(服务端)失败,则数据服务(客户端lib)读取该事务id对应的redo日志,生成异常文件,供异步平账进程重做处理;

14、后台异步平账进程,读取(redo日志)异常文件进行重做处理,处理结束。

图10为本发明的一个较佳实施例四的保证多数据库操作事务一致性的方法流程图,该实施例包括以下步骤:

1、应用app接收(或发起)dml请求(如update语句),通过api接口传递数据服务(客户端lib);

2、数据服务(客户端lib)设置事务id,并将dml对于的sql语句及相关绑定变量装入发送容器;

3、数据服务(客户端lib)将发送容器序列化处理,与数据服务(服务端)建立socket套接字连接,通过tcp/ip协议,将请求报文发送给数据服务(服务端);

4、数据服务(客户端lib)保持该socket连接,等待服务端返回应答信息;

5、数据服务(服务端)端将请求放入请求队列排队;

6、当有空闲的处理进程时,调度空闲进程处理处理该任务;如果没有空闲进程,该请求排队等待;在此过程中,如果有其他应用app发起socket接入和dml请求,采用相同处理,将请求放入队列排队;

7、空闲处理进程从请求队列中获取请求任务,获取数据库连接,执行dml语句,得到处理结果,将处理结果装入服务端发送容器;

8、数据服务(服务端)将本端发送容器序列化,找到响应请求包的socket套接字连接,将处理结果响应给数据服务(客户端lib);

9、处理进程检查(刚完成响应的)该dml语句是否需要事务保持(对于update、delete等需要提交的操作,都需要做事务保持),如果需要事务保持,则该处理进程设置为“事务id”独占模式,只处理事务id相同的请求,暂不处理其他事务id不一致的请求;如果不需要事务保持,则设置为空闲状态,以便调度进程将新任务派发给自己;

10、应用app再次发起dml(如update语句)请求,通过api接口传递数据服务(客户端lib);

11、数据服务(客户端lib)设置事务id为第一次请求的事务id以便事务重入(事务重入的目的可以看到相同事务id修改的“脏数据”),将dml对于的sql语句及相关绑定变量装入发送容器;

12、数据服务(客户端lib)将发送容器序列化处理,与数据服务(服务端)建立socket套接字连接(如果上次调用的socket没有断开可以复用),通过 tcp/ip协议,将请求报文发送给数据服务(服务端);

13、数据服务(客户端lib)保持该socket连接,等待服务端返回应答信息;

14、数据服务(服务端)端将请求放入请求队列排队;

15、检查是否有该事务id已独占的处理进程,如果有则派发给该处理进程。处理进程得到事务id相同的处理任务,获取数据库连接执行dml语句,得到处理结果,将处理结果装入服务端发送容器;

16、数据服务(服务端)将本端发送容器序列化,找到响应请求包的socket套接字连接,将处理结果响应给数据服务(客户端lib);

17、数据服务(客户端lib)将处理结果响应给应用app;

18、业务结束,应用app发起提交调用到数据服务(客户端lib),数据服务(客户端lib)设置事务id为第一次请求的事务id以便事务重入;

19、数据服务(客户端lib)将提交请求发送数据服务(服务端),数据服务(服务端),检查是否有该事务id已独占的处理进程,如果有则将提交请求派发给该事务id已独占的处理进程;

20、该事务id已独占的处理进程提交完毕,数据服务(服务端)响应给数据服务(客户端lib);该事务id已独占的处理进程释放独占,设置为空闲状态以便处理其他请求调用。

上述实施例四的方法适合于图9所示的系统进行数据库操作。如图9所示,进程app有两个线程对应两次请求,例如一个线程thread1负责更新余额,更新前原值等于100元,增加100元更新后余额变成200元;另一个线程thread2负责查询余额,在thread1先更新,thread2查询,利用图10所示流程图对应的方法可以确保thread2查询到的是200元(可以看到这个脏数据),而不是100元。

图12为本发明的一个较佳实施例六的保证数据库操作事务一致性的方法流程图,该实施例包括以下步骤:

1、服务a设置事务id(以下用uid标示),发起业务调用,整个业务过程中事务id唯一,通过socket接口基于tcp/ip协议,调用服务b;

2、服务b接收服务a的调用请求,设置事务id为服务a传入的uid,进行业务处理,发起dml请求,通过api接口传递数据服务(客户端lib);

3、服务b的数据服务(客户端lib)设置事务id等于uid,并将dml对于的sql语句及相关绑定变量装入发送容器;

4、服务b的数据服务(客户端lib)将发送容器序列化处理,与数据服务(服务端)建立socket套接字连接,通过tcp/ip协议,将请求报文发送给数据服务(服务端);

5、服务b的数据服务(客户端lib)保持该socket连接,等待服务端返回应答信息;

6、数据服务(服务端)端将请求放入请求队列排队;

7、当有空闲的处理进程时,调度空闲进程处理处理该任务;如果没有空闲进程,该请求排队等待;在此过程中,如果有其他应用发起socket接入和dml请求,采用相同处理,将请求放入队列排队;

8、空闲处理进程从请求队列中获取请求任务,获取数据库连接,执行dml语句,得到处理结果,将处理结果装入服务端发送容器;

9、数据服务(服务端)将本端发送容器序列化,找到响应请求包的socket套接字连接,将处理结果响应给服务b的数据服务(客户端lib);

10、处理进程检查(刚完成响应的)该dml语句是否需要事务保持,如果需要事务保持,则该处理进程设置为“事务id”独占模式,只处理事务id相同的请求,暂不处理其他事务id不一致的请求;如果不需要事务保持则设置为空闲状态,以便调度进程将新任务派发给自己;

11、服务b根据业务需要再次发起dml请求,设置事务id等于uid,通过api接口传递数据服务(客户端lib);以便事务重入(事务重入的目的可以看到相同事务id修改的“脏数据”);

12、服务b的数据服务(客户端lib)将发送容器序列化处理,与数据服务(服务端)建立socket套接字连接(如果上次调用的socket没有断开可以复用),通过tcp/ip协议,将请求报文发送给数据服务(服务端);

13、服务b的数据服务(客户端lib)保持该socket连接,等待服务端返 回应答信息;

14、数据服务(服务端)端将请求放入请求队列排队;

15、检查是否有该事务id已独占的处理进程,如果有则派发给该处理进程;

16、处理进程得到事务id相同的处理任务,获取数据库连接执行dml语句,得到处理结果,将处理结果装入服务端发送容器;

17、数据服务(服务端)将本端发送容器序列化,找到响应请求包的socket套接字连接,将处理结果响应给服务b的数据服务(客户端lib);

18、数据服务(客户端lib)将处理结果响应给服务b;

19、服务b将处理结果响应给服务a;

20、服务a根据业务需要再次发起dml请求,设置事务id等于uid,通过api接口传递数据服务(客户端lib);

21、服务a的数据服务(客户端lib)设置事务id为uid以便事务重入(事务重入的目的可以看到相同事务id修改的“脏数据”);

22、服务a的数据服务(客户端lib)将发送容器序列化处理,与数据服务(服务端)建立socket套接字连接(如果上次调用的socket没有断开可以复用),通过tcp/ip协议,将请求报文发送给数据服务(服务端);

23、服务a的数据服务(客户端lib)保持该socket连接,等待服务端返回应答信息;

24、数据服务(服务端)端将请求放入请求队列排队;

25、检查是否有该事务id已独占的处理进程,如果有则派发给该处理进程;

26、处理进程得到事务id相同的处理任务,获取数据库连接执行dml语句,得到处理结果,将处理结果装入服务端发送容器;

27、数据服务(服务端)将本端发送容器序列化,找到响应请求包的socket套接字连接,将处理结果响应给数据服务(客户端lib);

28、数据服务(客户端lib)将处理结果响应给服务a;

29、业务完成,服务a设置事务id等于uid,发起提交请求到服务b;

30、服务b检查事务id等于uid不是自己发起的事务,记录自己相关dml操作的redo日志,直接响应成功给服务a;

31、服务a收到服务b的正确响应后,继续处理,通过数据服务(客户端lib)发送提交请求;

32、数据服务(客户端lib)将提交请求发送数据服务(服务端),数据服务(服务端),检查是否有该事务id已独占的处理进程,如果有则将提交请求派发给该事务id已独占的处理进程;

该事务id已独占的处理进程提交完毕,数据服务(服务端)响应给数据服务(客户端lib);该事务id已独占的处理进程释放独占,设置为空闲状态以便处理其他请求调用。

33、提交成功,业务结束。

上述实施例六的方法适合于图11所示的系统进行数据库操作。如图11所示,服务a和服务b同时对一个数据库进行操作。例如更新前余额原值等于100元,服务a、b相互协调来完成一笔业务,a启动一个事务id,进程a增加100元更新后余额变成200元;进程b更新余额增加200元余额变成400元。如果不支持事务重入,进程a,进程b对于同一数据库的更新可能是两个数据库连接会话,造成结果不确定,可能是200元、300元、或400元,也可能因为碰到数据库并发锁冲突业务不成功。

若利用现有技术进行处理面临如下问题:

1、服务嵌套调用,同一数据库多次操作的事务管理;

2、调用的时序问题;

3、同一个事务id,脏数据的可视性。

4、事务异常时,最终一致性保证问题。

5、连接数的收敛问题。

通过利用图12所示流程图对应的方法尅达到如下效果:服务嵌套调用,同一数据库多次操作,通过独占式数据服务进程使用同一数据库会话连接确保、事务无问题、操作时序无问题、同一个事务id脏数据的可视;通过数据服务(数据访问层)进行请求排队和连接复用,达到数据库连接数收敛的目的。

上述实施例通过新增加数据访问层(dal)的数据服务(客户端lib)和数据服务(服务端)这种c/s装置,实现了数据连接数管理和收敛,同时还实现了对于同一事实id的,多次访问同一数据库的会话重入,确保同一事务内的“脏数据”(未提交的中间数据)对每次访问都透明可见。

本发明通过数据访问层(dal)实现多数据库操作的事务一致性方法和装置;通过数据访问层(dal)实现同一线程(或进程)访问数据服务,同一事务id多次操作的会话重入方法和装置;通过数据访问层(dal)实现服务嵌套调用的事务重入方法和装置。总之本发明的技术方案具有如下有益效果:

1、提供了一个统一的数据服务(数据访问层)支持对多个数据操作且能保证事务一致性,简化应用开发的复杂度。

2、能够支持跨服务的数据库连接会话重入,确保一个业务事务中,多个服务进程(或线程)对同一数据的多次修改后脏数据(未做提交中间数据)各个进程(或线程)透明可见。

3、支持对于应用和数据分离,应用通过数据访问层和多个数据库交互,建设数据访问层支持对dml操作的回滚和重做(redo),应用层不用处理路由管理和事务管理,从而简化应用,降低开发成本。

以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1