原文:https://www.cnblogs.com/vettel0329/p/10778931.html
mongoDB單個實例不支持事務,副本集才支持事務
- 1.准備好docker
- 2.Spring boot 版本為2.1.1.RELEASE及以上
首先以主從模式安裝mongodb 4.0.0以上的數據庫實例,使用以下docker命令安裝:(最新版不支持這種模式,必須是副本及模式,如果簡單測試,可以使用)
副本集搭建:https://www.cnblogs.com/lshan/p/12011980.html
docker run --privileged=true -p 10011:27017 -v $PWD/db1:/data/db -d --name template-db1 mongo:4.0.0 --replSet "templateRs0" --bind_ip_all docker run --privileged=true -p 10012:27017 -v $PWD/db2:/data/db -d --name template-db2 mongo:4.0.0 --replSet "templateRs0" --bind_ip_all 原文鏈接:https://blog.csdn.net/quanmaoluo5461/article/details/84880850
然后連接到一個數據庫實例以以下腳本初始化主節點:
rs.initiate( { _id : "templateRs0", members: [ { _id: 0, host: "172.16.2.87:10011" }, { _id: 1, host: "172.16.2.87:10012" }, ] })
rs.status()
依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
創建配置類,開啟事務
@Configuration public class TransactionConfig { @Bean MongoTransactionManager transactionManager(MongoDbFactory factory){ return new MongoTransactionManager(factory); } }
開啟事務:
@Service public class UserService { @Resource MongoTemplate mongotemplate; public List<User> getAllUser(){ return mongotemplate.findAll(User.class); } @Transactional public boolean addUser(User user, UserInfo userInfo){ user.setUserInfo(userInfo); mongotemplate.save(userInfo); // int a = 1/0; //事務測試代碼 mongotemplate.save(user); return true; } }
注:以上為MongoTemplate方式,MongoTemplate和MongoRepository方式都與Spring整合SpringDataMongoDB相同