摘要:官網中,對單文檔的操作是原子性的。因此建議使用嵌入式文檔來實現事務需求,而不是規范化的跨文檔設計。所以開始提供了對副本集多文檔事務的支持,注意是副本集,也就是說單是不生效的。上面創建的中的上添加了提供的注解,所以的事務可以和的事務統一管理。
</>復制代碼
官網:mongoDB中,對單文檔的操作是原子性的。例如insertOne,updateOne等操作。因此建議使用嵌入式文檔來實現事務需求,而不是規范化的跨文檔設計。但是業務上例如三方數據依賴的需求往往使用嵌入式文檔不是理想中的那么方便。所以4.0開始提供了對副本集多文檔事務的支持,注意是副本集,也就是說單server是不生效的。
接下來的測試需要集群環境,賴得搭建,所以使用mongoDB Cloud提供的Altas的免費集群。
創建測試數據user
info
創建springboot項目 添加依賴</>復制代碼
org.springframework.boot
spring-boot-starter-parent
2.1.5.RELEASE
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
true
com.alibaba
fastjson
1.2.58
org.springframework.boot
spring-boot-starter-data-mongodb
連接mongoDB
</>復制代碼
這里涉及到了Write Concern,推薦閱讀MongoDB writeConcern原理解析
w=majority:數據寫入到副本集大多數成員后向客戶端發送確認,適用于對數據安全性要求比較高的場景,該選項會降低寫入性能
w=1:默認的writeConcern,數據寫入到Primary就向客戶端發送確認
Read Concern推薦閱讀MongoDB readConcern 原理解析
</>復制代碼
spring.data.mongodb.uri=mongodb+srv://vulgar:761341@cluster0-t16it.mongodb.net/vulgar_test?retryWrites=true&w=majority
配置mongoDB事務管理
</>復制代碼
@Configuration
public class MongoTransactionConfiguration {
@Bean
MongoTransactionManager mongoTransactionManager(MongoDbFactory factory) {
return new MongoTransactionManager(factory);
}
}
創建對應實體類
User.class
</>復制代碼
@Data
@Document(collection = "user")
public class User implements Serializable {
private static final long serialVersionUID = -7257487638617643262L;
private String username;
private String password;
private String sex;
private Integer age;
private String email;
}
Info.class
</>復制代碼
@Data
@Document(collection = "info")
public class Info implements Serializable {
private static final long serialVersionUID = 4494527542566322152L;
private String username;
private String description;
}
創建測試SERVICE
</>復制代碼
@Slf4j
@Service("mongoService")
public class MongoService {
@Autowired
private MongoTemplate mongoTemplate;
@Transactional(rollbackFor = ArithmeticException.class)
public void updateWithTransaction() {
Query query = new Query(Criteria.where("username").is("vulgar-cd"));
Update update = new Update();
update.set("age", 10);
mongoTemplate.updateFirst(query, update, User.class);
User user = mongoTemplate.findOne(query, User.class);
log.info("user is {}", JSON.toJSON(user));
update = new Update();
update.set("description", "hahahaha");
mongoTemplate.updateFirst(query, update, Info.class);
Info info = mongoTemplate.findOne(query, Info.class);
log.info("info is {}", JSON.toJSON(info));
//測試事務回滾
int i = 1/0;
}
}
創建測試CONTROLLER
</>復制代碼
@Slf4j
@RestController
public class MongoController {
@Resource(name = "mongoService")
private MongoService mongoService;
@GetMapping("/transaction")
public void updateWithTransaction() {
mongoService.updateWithTransaction();
}
}
啟動引用程序
可以看到程序連上了集群,然后在終端執行curl http://localhost:8080/transaction可以看到如下日志
最后查看mongoDB中的數據,可以看到數據沒有被更改。
上面創建的MongoService中的updateWithTransaction上添加了spring提供的@Transactional注解,所以mongoDB的事務可以和mysql的事務統一管理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75074.html
摘要:介紹事務和副本集副本集是的一種主副節點架構,它使數據得到最大的可用性,避免單點故障引起的整個服務不能訪問的情況的發生。在事務中執行的數據操作是對外隔離的,也就是說事務中的操作是原子性的。中止當前的事務,并將事務中執行過的數據修改回滾。 前言 相信使用過主流的關系型數據庫的朋友對事務(Transactions)不會太陌生,它可以讓我們把對多張表的多次數據庫操作整合為一次原子操作,這在高并...
摘要:參考鏈接官方關于事務的介紹中文社區關于的介紹如果不想進行第二步,可以直接為你創建一個新的復制集我只是個前端啊,為什么要這么折磨我 主管前幾天發現mongoDB已經升級到4.0了,迫不及待得讓我實現他期待已久的事務回滾,發現還是有很多坑啊!下面是我將已有的本地mongoDB升級到支持事務回滾的歷程,分享出來,有錯誤的地方歡迎指正!以mac為例哈 部署mongodb事務回滾 1.準備工作 ...
摘要:原文保持更新及修正基于的客戶端配置選項,其它驅動大同小異。連接池中連接的最大使用壽命毫秒。設置該選項后,客戶端將進行以下行為以副本集模式連接,并根據給定的服務器發現副本集的所有成員。該選項可以和配合使用。編解碼器用于對進行編碼和解碼。 原文保持更新及BUG修正:http://kweny.io/mongodb-clien... 基于 MongoDB Java Driver 3.8.1 ...
摘要:可水平擴展,可以添加更多服務器來擴展您的數據庫需要管理員是否開發人員和管理員都可以使用適用場景會計師事務所和銀行,以及需要具有清晰架構的結構化數據的其他公司。 今天的主題是從MongoDB漫談數據庫,在日常的項目中,我們一般都是使用的mysql作為數據庫,但是一旦有問題,又常常會聽到類似要不換成MongoDB試試的聲音,因此就讓我們這些小白來隨便聊聊數據庫 什么是數據庫 我們就用最簡單...
閱讀 3448·2021-10-14 09:42
閱讀 2738·2021-09-08 10:44
閱讀 1312·2021-09-02 10:18
閱讀 3626·2021-08-30 09:43
閱讀 2808·2021-07-29 13:49
閱讀 3730·2019-08-29 17:02
閱讀 1589·2019-08-29 15:09
閱讀 1041·2019-08-29 11:01