Skip to content
广告❤️成为赞助商

事务

MongoPlus提供了对MongoDB的事务操作(声明式事务和编程式事务),但前提是MongoDB需要开启副本集并且版本需要在MongoDB4以上才会支持

配置文件

  • 我们需要在配置文件中配置一些额外的配置
yaml
mongo-plus:
  data:
    mongodb:
      host: 192.168.110.1,192.168.110.1
      port: 27017,27018
      database: mp
      connectTimeoutMS: 50000
      retryWrites: true
      w: majority
      replicaSet: mp    #指定rs的name

声明式事务 -> @MongoTransactional注解

  • 无需手动try catch和提交回滚,只需一个注解即可
  • 标注了此注解,即可轻松实现对MongoDB的事务操作

使用Spring的@Transactional注解:

  • MongoPlus支持使用Spring的@Transactional注解的方式控制事务
  • 需要注意的是,Spring已经弃用了将事务管理器组合起来的类,暂时还没有找到可替换的类
  • 使用时,需要启动该配置,配置详情请查看 配置->配置文件->Spring配置->transaction 项,由于无法组合起来,所以会使用MongoPlus的事务管理器

声明式事务示例:

  • 接下来我们用一个简单的案例来进行编程式事务事务操作
java
@PostMapping("/addRole")
@ApiOperation("添加角色")
//使用事务注解
@MongoTransactional
public Boolean addRole(@RequestBody Role role){
    return roleService.save(role);
}

编程式事务 -> MongoTransactional类

  • 该类提供对事务的一些操作,创建、开启、提交、回滚、关闭

createTransaction()

  • 创建一个事务,方法会返回一个ClientSession接口,其中包含事务的信息

startTransaction()

  • 创建并开启一个事务,该方法将会返回一个ClientSession接口

startTransaction(ClientSession clientSession)

  • 启动一个事务,该方法需要手动传递一个ClientSession,将会开启传递的ClientSession

commitTransaction()

  • 提交一个事务,该方法需要手动传递一个ClientSession,将会提交该事务

commitAndCloseTransaction(ClientSession clientSession)

  • 提交并关闭一个事务,该方法需要手动传递一个ClientSession,将会提交并关闭该事务

rollbackTransaction(ClientSession clientSession)

  • 回滚一个事务,该方法需要手动传递一个ClientSession,将会回滚该事务

rollbackAndCloseTransaction(ClientSession clientSession)

  • 回滚并关闭一个事务,该方法需要手动传递一个ClientSession,将会回滚并关闭该事务

closeTransaction(ClientSession clientSession)

  • 关闭一个事务,该方法需要手动传递一个ClientSession,将会关闭该事务

编程式事务示例:

  • 接下来我们用一个简单的案例来进行编程式事务事务操作
java
// 创建并开启一个事务
ClientSession clientSession = MongoTransactional.startTransaction();
try {
    //执行删除操作
    userService.removeById(clientSession,1);
    int i = 1 / 0;
}catch (Exception e){
    //回滚并关闭事务
    MongoTransactional.rollbackAndCloseTransaction(clientSession);
    return false;
}
//提交并关闭事务
MongoTransactional.commitAndCloseTransaction(clientSession);
return true;