`
shangjava
  • 浏览: 1189431 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

利用业务事务处理WEB服务交互

Web 
阅读更多

WEB服务接口(这里专指有状态更新的服务接口)如果允许补偿操作的话,很多情况下可以遵循如下的业务事务交互方式来处理:

客户端步骤:

客户调用服务接口=>

1.、如果返回成功=>更新状态成功,继续本地系统处理

2、 如果返回失败=>更新状态失败,继续本地系统处理

3、 如果调用出现异常=>更新状态重试,继续本地系统处理,并采用定时器进行补偿重试调用服务接口,直到接口正确返回成功或者返回失败

服务端步骤:

1、接收到客户调用=>检查是否是同一个调用(根据OID,OID一致则是认为是同一个调用)=>如果不是同一个调用,执行并返回结果

2、 否则如果是同一个调用,返回第一次调用的执行的结果(可能是成功、也可能是失败,这里可以返回错误码)

客户方使用服务接口时需要提供的必要信息有:

1、客户方身份标志ID =>目的是标志客户身份

2、与业务相关的独立外部订单号,也可以叫做操作流水号(OID) ,对于该客户来说这个OID必须唯一(但是可以和其他客户的 OID相同) =>用来标记客户的消息,如果该客户每次都在该接口上使用相同的OID,那么服务方可以认为客户进行的是一个处理。

3、真正的业务数据


接口大概可以是这样 Result method(clientId,OID,bussinessData)throws Exception;

上面1、2是保证同一个客户的同一次操作多次调用不会产生副作用而建立的模型,3才是真正的业务数据。

为什么要这么设计呢?原因很简单,WEB服务调用需要考虑的通信异常的情况,如果服务调用时一旦发生通讯异常,那么客户将无法判定当前的服务操作是否成功。我们可以看一个例子:

A用调用银行的扣款接口,银行接口返回true,则表示扣款成功。返回false,则表示扣款失败,客户A根据返回值在本地做相应的处理。如果服务调用过程中,通讯出现了异常,那么客户A无法判定银行扣款是否成功,那么客户A需要银行提供的查询接口进行查询,来判定此次调用是否成功。这个时候就需要一个查询ID,我们这里使用OID来表示。那么银行怎么知道我们的OID呢? 所以就需要通过银行扣款接口来传递OID流水号,银行在处理扣款过程中,需要将客户的OID记录下来。一旦客户通过OID查询时,就可以得到扣款操作的结果。?(有的人可能不明白为什么这个OID一定要客户自己定义,而不是由银行来自动生成,道理很简单,因为如果在扣款接口调用出现异常时,我们根本无法得到银行提供的OID。)

正因为有了OID,所以扣款接口的处理逻辑需要有一定变化,过程如下:

首先,银行在银行系统中需要检查客户A的该次调用的OID流水号是否存在,不存在表示没有进行过调用,则进行扣款操作并返回扣款结果。如果OID流水号存在,那么查询调用结果,并返回成功还是失败。

因此,对于客户A来说,这里的扣款接口其实是包含了查询和扣款两个功能,如果没有扣款,那么我就扣。如果已经扣了,那么就返回结果。

由于WEB服务的存在,要进行分布式事务处理的复杂度就非常高。如果系统需求允许采用补偿操作来进行扣款,我们就可以在调用扣款服务出现异常时,采用定时器或者其他方式补偿调用扣款服务接口来执行扣款。而本地系统则可以按照已经扣款的方式进行处理。这个是在牺牲了事务的部分完整性和一致性上来完成的。

一般情况下,使用这种业务事务就已经能够非常好的满足需求了,不需要再依赖底层的分布式事务处理,这样也节省了资源,提高了效率。


注:

事务的典型特点是具备ACID特征。ACID指的是Atomic(原子的)、Consistent(一致的)、Isolated(隔离的)以及Durable(持续的),它们代表着事务处理应该具备的四个特征:

  原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分

  一致性:在事务处理执行之前和之后,数据是一致的。

  隔离性:一个事务处理对另一个事务处理没有影响。

  持续性:当事务处理成功执行到结束的时候,其效果在数据库中被永久纪录下来。


传统事务和业务事务区别:

传统事务要求系统在每一个时刻都保持一致性,而业务事务则放宽了这一限制,只要求系统处理数据最后的状态保持一致就可以了。

分享到:
评论

相关推荐

    数据库服务器(全文).doc

    Web服务器可以只处理Web请求 ,不处理数据库操作,可以更好地利用带宽资源。 链接:网络嗅探 网络嗅探(Network Sniffer),是指利用计算机的网络接口截获目的地为其它计算机的数据报文的一种手段 。 网络嗅探需要...

    免费计算机毕业设计-基于JavaWeb的校园二手交易平台设计与实现(包含论文+源码)

    该平台采用Spring框架进行业务逻辑处理和事务管理,使用Spring MVC实现前端请求与后端服务的解耦,以及MyBatis或Hibernate作为ORM工具与数据库交互。主要功能包括用户注册与登录、商品浏览、发布与编辑二手商品、...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    目前市场业务中在产品以及其他项目的认证和检测方面存在诸多不便,用户需要实地考察并频繁与检测单位沟通,填写繁琐的纸质检测报告、当面送递样品,对于检测环节中存在的问题难以及时交互并处理。市场上相应的检测...

    struts2.4+spring3.1+hibernate4.1的SSH框架

    在业务层中,管理服务组件的Spring IoC容器负责向Action提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。...

    ssm项目微信小程序养老院系统.zip

    整个项目采用MVC设计模式,Spring负责整体业务逻辑的处理和依赖注入,Spring MVC用于处理HTTP请求和页面跳转,而MyBatis负责与MySQL数据库的交互操作。数据库设计优化了存储结构和查询效率,以适应养老院管理系统的...

    免费计算机毕业设计-流浪猫狗救助平台(包含代码和论文)

    该平台利用Spring框架进行业务逻辑和事务管理,SpringMVC作为模型-视图-控制器框架处理前端请求与视图展示,而MyBatis则作为ORM工具与数据库进行交互,实现数据的增删改查。流浪猫狗救助平台主要功能包括流浪动物...

    《JSP简明教程》课件

    从只有一个小的jar文件就可以运行servlet/jsp到由多台服务器进行集群和负载均横,到多台Application进行事务处理、消息处理等。 JSP也有它自己的不足: 跨平台的功能和极度的伸缩能力极大的增加了产品的复杂性。也...

    weixin061互助学习小程序的设计与实现+ssm(源码+部署说明+演示视频+源码介绍+lw).rar

    Spring负责依赖注入和事务管理,Spring MVC处理Web层的请求分发,而MyBatis则作为数据访问层,负责与数据库交互。 功能: 用户注册与登录:允许用户创建账户并登录小程序,可能还包括微信授权登录,以便利用微信的...

    基于SSM框架个性化影片推荐系统.zip

    Spring还提供了一系列服务和设计模式的实现,如事务管理、安全性、JDBC操作等。 2. **Spring MVC**: 作为Spring的一个模块,Spring MVC是一个模型-视图-控制器(MVC)的Web框架,用于构建Web应用程序。它提供了一种...

    weixin001基于小程序的购物系统设计与实现+ssm.zip

    基于小程序的购物系统设计与实现结合了现代的Web技术和移动应用开发便利性,本系统采用了SSM(Spring, Spring MVC, MyBatis)框架作为后端开发的核心架构,并利用微信小程序作为前端展示和交互界面。 技术栈介绍 ...

    asp.net技术内幕(1)

    5.3 显露用户控件中的Web控件 5.4 显露用户控件中的事件 5.5 通过程序装载用户控件 5.6 小结 <br>第6章 将代码与表示分离 <br>6.1 创建业务组件 6.2 创建多层Web应用程序 6.3 使用...

    asp.net技术内幕(2)

    5.3 显露用户控件中的Web控件 5.4 显露用户控件中的事件 5.5 通过程序装载用户控件 5.6 小结 <br>第6章 将代码与表示分离 <br>6.1 创建业务组件 6.2 创建多层Web应用程序 6.3 使用...

    asp.net技术内幕(5)

    5.3 显露用户控件中的Web控件 5.4 显露用户控件中的事件 5.5 通过程序装载用户控件 5.6 小结 <br>第6章 将代码与表示分离 <br>6.1 创建业务组件 6.2 创建多层Web应用程序 6.3 使用...

    asp.net技术内幕(4)

    5.3 显露用户控件中的Web控件 5.4 显露用户控件中的事件 5.5 通过程序装载用户控件 5.6 小结 <br>第6章 将代码与表示分离 <br>6.1 创建业务组件 6.2 创建多层Web应用程序 6.3 使用...

    asp.net技术内幕(3)

    5.3 显露用户控件中的Web控件 5.4 显露用户控件中的事件 5.5 通过程序装载用户控件 5.6 小结 <br>第6章 将代码与表示分离 <br>6.1 创建业务组件 6.2 创建多层Web应用程序 6.3 使用...

    数据库应用程序实用攻略

    2:业务逻辑层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。 3:表示层:主要表示WEB方式,也可以表示成WINFORM方式,WEB...

    ASP.net技术内幕

    内容包括:ASP.NET Web表单的使用,高级ASP.NET页面的开发,ADO.NET的使用,ASP.NET应用程序的使用, ASP.NET应用程序的保护,ASP.NET Web服务的建立,.NET框架的利用,自定义的ASP.NET控件的建立,ASP.NET的应用...

    ASP3《高级编程》(第一部分)

    13.2.5 业务组件 417 13.2.6 用户界面组件 418 13.3 组件应用程序设计 418 13.3.1 转换到组件 419 13.3.2 应用程序设计 419 13.3.3 设计网络组件 420 13.3.4 组件设计 422 13.3.5 组件集成 423 13.3.6 建立...

    ASP3《高级编程》(第二部分)

    13.2.5 业务组件 417 13.2.6 用户界面组件 418 13.3 组件应用程序设计 418 13.3.1 转换到组件 419 13.3.2 应用程序设计 419 13.3.3 设计网络组件 420 13.3.4 组件设计 422 13.3.5 组件集成 423 13.3.6 建立...

    Spring面试题

    对于该实现,开启信用帐户要求用户与以下服务进行交互: ☆ 信用级别评定服务,查询用户的信用历史信息。 ☆ 远程信息链接服务,插入客户信息,将客户信息与信用卡和银行信息连接起来,以进行自动借记(如果需要的...

Global site tag (gtag.js) - Google Analytics