SpringBoot2.2.x+MongoDB4.0.x操作事务。

20 篇文章 0 订阅
8 篇文章 0 订阅

MongoDB对事务的支持是在4.0以及以上的版本。并且如果想要对事务支持,必须要配置MongoDB副本集。因为Mongo的事务是建立在副本集上的。
这里配置副本集:https://blog.csdn.net/qq_19674263/article/details/105799181

Maven配置:

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-mongodb</artifactId>
		</dependency>

application.properties

spring.data.mongodb.uri=mongodb://root:root@localhost:27000/qcx_test?replicaSet=rs

必须要设置 replicaSet指定节点名称,在配置文件中配置的。

想要对事务支持,要这是MongoDB事务配置

@Configuration
public class MongoDBConfig {
    @Bean
    MongoTransactionManager transactionManager(MongoDbFactory factory){
        return new MongoTransactionManager(factory);
    }
}

然后就是基本的业务代码了
两个实体类User和Role

public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键自增
     */
    private Long id;

    /**
     * 用户名
     */
    private String userName;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 密码
     */
    private String passWord;

    /**
     * 当前用户的上级主键
     */
    private Long leaderId;

    /**
     * 人员类型0/1:普通员工/管理员
     */
    private Integer type;

    /**
     * 是否在线0/1:否/是
     */
    private Boolean online;

    /**
     * 删除标志(0/1:在用/停用)
     */
    private Integer dr;

    /**
     * 最后登录时间
     */
    private LocalDateTime lastLoginTime;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    public Long getLeaderId() {
        return leaderId;
    }

    public void setLeaderId(Long leaderId) {
        this.leaderId = leaderId;
    }
    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }
    public Boolean getOnline() {
        return online;
    }

    public void setOnline(Boolean online) {
        this.online = online;
    }
    public Integer getDr() {
        return dr;
    }

    public void setDr(Integer dr) {
        this.dr = dr;
    }
    public LocalDateTime getLastLoginTime() {
        return lastLoginTime;
    }

    public void setLastLoginTime(LocalDateTime lastLoginTime) {
        this.lastLoginTime = lastLoginTime;
    }
}
public class Role implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 权限名
     */
    private String roleName;

    /**
     * 备注
     */
    private String remark;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }
    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
}

两个数据访问层UserDao和RoleDao

@Repository
public class UserDao {

    @Autowired
    private MongoTemplate mongoTemplate;

    public void insert(User user){
        mongoTemplate.insert(user);
    }

    public void update(User user){
        Query query = Query.query(Criteria.where("id").is(user.getId()));
        Update update = new Update().set("age",user.getAge());
        mongoTemplate.updateFirst(query,update,User.class);
    }

    public void deleteById(Long id) {
        Query query=new Query(Criteria.where("id").is(id));
        mongoTemplate.remove(query,User.class);
    }

    public User find(Long id){
        Query query = new Query(Criteria.where("id").is(id));
       return mongoTemplate.findOne(query,User.class);
    }
}
@Repository
public class RoleDao {
    @Autowired
    private MongoTemplate mongoTemplate;

    public void insert(Role role){
        mongoTemplate.insert(role);
    }
}

一个业务逻辑测试类

@Service
public class MongoDBServiceImpl implements MongoDBService {
    @Autowired
    private UserDao userDao;

    @Autowired
    private RoleDao roleDao;

    @Transactional(rollbackFor = {Exception.class})
    public Boolean testTran() {
        User user1 = userDao.find(1l);
        user1.setAge(36);
        userDao.update(user1);

        Role role = new Role();
        role.setId(3l);
        role.setRoleName("hahaha");
        role.setRemark("dasdsadad");
        roleDao.insert(role);

        User user = new User();
        user.setId(2l);
        user.setAge(22);
        user.setUserName("qwerty");
        user.setOnline(false);
        userDao.insert(user);

        return null;
    }
}

注意:
mongo在支持事务的同时,就不支持自动创建表了,所以如果我们想自动创建表就不能把初始化表的代码放在事务里。最好是提前手动执行好建表语句。
db.createCollections();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值