MongoDB支持事务

DAO层:

package com.method.userservice.service;

import com.method.userservice.entity.BaseEntity;
import com.method.userservice.util.Reflact;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.springframework.beans.factory.annotation.Autowired;

import java.lang.reflect.ParameterizedType;

public class Dao<T extends BaseEntity> {

    @Autowired
    private MongoDatabase mongoDatabase;

    private MongoCollection mongoTemplate;

    private Class<T> type;

    public Dao() {
        type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    public MongoCollection getDao() {
        if (mongoTemplate == null)
            mongoTemplate = mongoDatabase.getCollection(Reflact.getCollectionName(type));
        return mongoTemplate;
    }

}

 MongoDB配置:

package com.method.userservice.core;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientURI;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoDatabase;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.codecs.pojo.PojoCodecProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;

import java.util.logging.Level;

import static java.util.logging.Logger.getLogger;
import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
import static org.bson.codecs.configuration.CodecRegistries.fromRegistries;

@Configuration
public class MongoConfig extends AbstractMongoConfiguration {

    @Bean
    public MongoClient mongoClient() {
        return new MongoClient(new ServerAddress("localhost", 27017));
    }

    @Deprecated
    @Bean
    public MongoTemplate mongoTemplate() {
        return new MongoTemplate(mongoClient(), "test");
    }

    @Bean
    public GridFsTemplate gridFsTemplate() throws Exception {
        return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter());
    }

    @Bean
    public MongoDatabase mongoDatabase() {
        return mongoClient().getDatabase("test");
    }

    @Override
    protected String getDatabaseName() {
        return "test";
    }

}

service层:


    public boolean transfer(String from, String to, Double money) {
        ClientSession clientSession = mongoClient.startSession();
        try {
            clientSession.startTransaction();
            super.getDao().updateOne(clientSession, Criteria.where("name").is(to).getCriteriaObject(), inc("balance", money));
            int a = 1 / 0;
            super.getDao().updateOne(clientSession, Criteria.where("name").is(from).getCriteriaObject(), inc("balance", -money));

            clientSession.commitTransaction();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            clientSession.abortTransaction();
            return false;
        } finally {
            clientSession.close();
        }
    }

拜了个拜~~

前提是,MongoDB需要配置复制集,可以参考这位博主的帖子:https://blog.csdn.net/mchdba/article/details/51638131

其实我算是没有搭建成功的,不过其实也可以不用有从数据库,只把自己做成主数据库就可以了。没有slave也可以的。

发布了29 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u012803274/article/details/81607193