启用事务

事务支持两种:一种是 SpringBoot 事务,用于应用内资源的事务管理;另一种是分布式事务,用于租户内跨应用的事务管理,使用数据库代理服务 DBProxy 的事务实现

SpringBoot 事务

在 Java 代码中访问的资源在同一应用内,使用 SpringBoot 提供的声明式事务管理,实现应用内启用事务。

在请求定义中设置启用事务,服务编译时,会在 controller 的方法前,增加 @Transactional 注解,从而实现事务管理。

图 0

分布式事务

在 Java 代码中访问的资源不在同一应用内,使用系统提供的分布式事务管理,实现跨应用启用事务。

在请求定义中设置启用分布式事务,服务编译时,会在 controller 的方法前,增加 @GlobalTransactional 注解,从而实现分布式事务管理。

图 1

例如:在服务中,通过 API 调用另外两个应用的服务,服务定义时勾选上“启用分布式事务”,服务代码如下:

public void fenbusswdy() throws Exception {
    //调用 batchdemo1 应用的服务
    ServiceUtil.get(SpringWebUtil.getRequest(),"batchdemo1", "/main/fenbusdemo1/fuwuy?code=5", null);

    //调用 batchdemo2 应用的服务
    ServiceUtil.post(SpringWebUtil.getRequest(),"batchdemo2","/main/shiwucse/shiwucs?num=5", null);      
    return;
}

如果服务是自定义 Controller 实现的,要使用分布式事务,在 Controller 中添加 @GlobalTransactional 注解,代码如下

import com.justep.tools.db.GlobalTransactional;

@RequestMapping(value = "/main/fuwu/fenbusswdy", method = RequestMethod.POST)
@GlobalTransactional
public void fenbusswdy() throws Exception {
    //调用batchdemo1应用的服务
    ServiceUtil.get(SpringWebUtil.getRequest(),"batchdemo1", "/main/fenbusdemo1/fuwuy?code=5", null);

    //调用batchdemo2应用的服务
    ServiceUtil.post(SpringWebUtil.getRequest(),"batchdemo2","/main/shiwucse/shiwucs?num=5", null);      
    return;
}

案例说明:

  • batchdemo1、batchdemo2 是另外两个应用的应用名
  • /main/fenbusdemo1/fuwuy、/main/shiwucse/shiwucs 是服务地址
  • code 和 num 是服务的参数

分布式事务实现原理

系统中所有执行的 SQL 在发往数据库之前,都经过数据库代理服务 DBProxy 转发,数据库代理服务提供两个重要能力

  • 分布式事务
  • 数据权限

企业门户应用中包含“数据库代理服务”,企业门户应用的架构如下图所示

企业应用中包括“数据库代理客户端”,企业应用的架构如下图所示

使用数据库代理的企业应用的 SQL 都会经过企业门户应用的数据库代理服务,在这里实现分布式事务

案例位置

桌面-页面-数据集-前后端实现事务.w

results matching ""

    No results matching ""