公开/公告号CN102945264A
专利类型发明专利
公开/公告日2013-02-27
原文格式PDF
申请/专利权人 浪潮集团山东通用软件有限公司;
申请/专利号CN201210408530.0
发明设计人 赵启杰;
申请日2012-10-24
分类号G06F17/30;
代理机构
代理人
地址 250101 山东省济南市高新区舜雅路1036号
入库时间 2024-02-19 16:59:17
法律状态公告日
法律状态信息
法律状态
2017-02-15
授权
授权
2017-02-08
著录事项变更 IPC(主分类):G06F17/30 变更前: 变更后: 申请日:20121024
著录事项变更
2014-04-09
实质审查的生效 IPC(主分类):G06F17/30 申请日:20121024
实质审查的生效
2013-02-27
公开
公开
技术领域
本发明涉及一种计算机技术,具体地说是一种智能启用分布式事务的方法。
背景技术
事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚。对于一个分布式事务(Distributed Transaction)来讲,事务的参与者分布于网络环境中的不同的节点。参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
由于分布式事务的逻辑更加复杂,涉及到更多组件。微软.NET框架对分布式事务提供了支持,包括显式事务、隐式事务、显式分布式事务、隐式分布式事务。微软的分布式事务基于MSDTC组件。该组件的稳定性、可用性受环境影响程度较高。
在一个业务软件系统中,包含许多业务组件,在运行期,这些业务组件可以对应不同的数据访问层组件实例。在一个业务处理中,这些业务组件按照一定的流程进行编排。这样多个数据访问层实例就需要协同工作,保证数据的完整、一致。要实现这个目标,数据库本地事务就无法满足需求。因为每个组件都处于一个“隐式”的调用环境中,组件的数据访问层不能与特定的调用场景耦合。因此必须采用分布式事务才能达到目标。这样,就带来一个问题:如果所有的组件的访问层都与同一个数据库通讯,那么实际的分布式事务可以简化为数据库、应用服务器两个参与者。
TransactionScope在文档中宣称只在“必要”情况下才提升事务级别(多数据库时才使用分布式事务,如果是同一个数据库,最好使用SqlTransaction),但是事实上不是这样。在TransactionScope内,只要你用不同的SqlConnection对象操作DB一次以上(不管你的目标是不是同一个实例、同一个库),都会提升事务级别到分布式事务,无疑会大大增加系统负担,降低服务器性能。
发明内容
本发明的技术任务是针对上述现有技术的不足,提供智能启用分布式事务的方法。利用该方法可以有效解决在单数据库场景下,因为使用分布式事务而带来的配置、部署的复杂性,并提升系统性能。
本发明的技术任务是按以下方式实现的:智能启用分布式事务的方法,对微软.NET的分布式事务接口进行透明封装,多个数据访问层协同工作时,如果后台数据库为同一实例时,自动启用数据库事务,若是多个数据库实例,则自动启用分布式事务,并且把已经启用的数据库事务与分布式事务融合。
上述方法的具体实现方法包含数据库连接管理及分布式事务代理两部分。
1)数据库连接管理:
实现一个数据库连接工厂GSPDatabaseFactory,以数据库连接工厂GSPDatabaseFactory实现对数据源创建的管理,创建数据库连接成功后放入内部连接池;
数据库连接工厂GSPDatabaseFactory根据连接字符串形成连接信息字段列表,再根据当前线程上下文Token形成一个索引值,根据这个索引值在内部连接池中检索可用的数据库连接;
数据库连接工厂GSPDatabaseFactory的GetDatabase方法返回一个接口IGSPDatabase有执行SQL语句的接口方法和开启、关闭数据库的方法,在不启用分布式事务的情况下,由数据库连接工厂GSPDatabaseFactory智能管理数据库连接的开启和关闭;
2)分布式事务代理:
实现一个虚拟分布式事务协调器:VirtualDTC,初次调用下述代码,初始化当前调用上下文中的虚拟分布式事务作用域,
VirtualTransactionScope scope1 = new
VirtualTransactionScope(TransactionScopeOption.Required);
当前调用堆栈继续调用上面代码,根据TransactionScopeOption参数的值来确定虚拟分布式事务如何融合,虚拟分布式事务协调器记录当前管理的数据库连接,如果后续创建的数据库连接与连接池中的连接信息相同,则直接使用连接池中的连接,接着比较当前正在使用的数据库连接是否就是匹配的连接:如果相同,并且事务属性是Required,则前后两次数据库连接进行合并,并且增加引用计数;外部调用代码后续试图关闭数据库时,由数据库连接管理器负责减少引用计数;
如果连接信息相同,但是事务属性是RequiredNew,则内部创建一个显式的分布式事务,并且把管理的内部数据库连接登记到该显式事务中;
如果与堆栈上连接信息不同,则直接启动显式分布式事务,并把现有数据库连接登记到分布式事务。
与现有技术相比,本发明的智能启用分布式事务的方法解决了在单一数据库的环境下,由于各个数据访问层为了保证数据的一致,而必须使用分布式事务带来的性能损失问题。在升级为多数据库实例时,各个数据访问层的事务处理无需任何修改,即可自动启用分布式事务。这样,在单一数据库部署架构下,就大大降低了对MSDTC组件的依赖,大大提高系统的稳定性、可靠性。
附图说明
附图1是本发明智能启用分布式事务的方法中虚拟分布式事务的算法逻辑图。
具体实施方式
参照说明书附图以具体实施例对本发明的智能启用分布式事务的方法作以下详细地说明。
实施例:
本发明智能启用分布式事务的方法的具体实现方案包括:1) 数据库连接管理、2) 分布式事务代理。
1、数据库连接管理。
通常的数据库连接创建代码如下:
DBConnection myConnection = new SqlConnection(myConnString);
本方法实现一个数据库连接工厂GSPDatabaseFactory,实现对数据源创建的管理,创建数据库连接成功后放入内部连接池。
IGSPDatabase=GSPDatabaseFactory.GetDatabase(myConnString);
这个GSPDatabaseFactory根据连接字符串形成连接信息字段列表,再根据当前线程上下文Token形成一个索引值,根据这个索引值在内部连接池中检索可用的数据库连接。
工厂类GSPDatabaseFactory的GetDatabase方法返回一个接口IGSPDatabase有执行SQL语句的接口方法和开启、关闭数据库的方法。在不启用分布式事务的情况下,由GSPDatabaseFactory智能管理数据库连接的开启和关闭。
2、分布式事务代理。
分布式事务代理实现一个虚拟分布式事务协调器:VirtualDTC。初次在调用下面代码,初始化当前调用上下文中的虚拟分布式事务作用域。
VirtualTransactionScope scope1 = new
VirtualTransactionScope(TransactionScopeOption.Required);
如附图1所示,当前调用堆栈继续调用上面代码,则会根据TransactionScopeOption参数的值来确定虚拟分布式事务如何融合。虚拟分布式事务协调器记录当前管理的数据库连接,如果后续创建的数据库连接与连接池中的连接信息相同,则直接使用连接池中的连接,接着比较当前正在使用的数据库连接是否就是匹配的连接:如果相同,并且事务属性是Required,则前后两次数据库连接进行合并,并且增加引用计数。外部调用代码后续试图关闭数据库时,由数据库连接管理器负责减少引用计数;如果连接信息相同,但是事务属性是RequiredNew,则内部创建一个显式的分布式事务;
CommittableTransaction Internaltran= new
CommittableTransaction();
并且调用下面代码把管理的内部数据库连接登记到该显式事务中:
InternalLocalconn.EnlistTransaction(Internaltran);
如果与堆栈上连接信息不同,则直接采取上述方式,即启动显式分布式事务,并把现有数据库连接登记到分布式事务。
机译: 个性化例如安全模块中的智能电表或智能电表网关的方法家庭,涉及在智能电表上启用初始通信访问和/或为第一台计算机系统启用智能电表网关
机译: 用于包括具有智能直升机的垂直起飞和着陆系统的支持飞机着陆的智能直升机以及启用该智能直升机的方法
机译: 将智能手机用户的状态广播到其他智能手机并使用发送的消息来禁用/重新启用用户之间的通信的方法