【MongoDB】事务

  

事务事务/h2>   (TOC)

  

译者前言:

  

数据模型定义对照:

           MySQL   MongoDB               行   文档         表   集合         库   库         组复制   复制集            

专有名词翻译约定:

           中文   原文               读一致性   readConcern         写一致性   writeConcern            

简介:

  

4.0版本中加入

  

4.0版本中的新   

在MongoDB中,针对单个文档的操作是原子性的。由于MongoDB允许在单个文档中嵌入用以表示相互之间关系的子文档和数组来替代跨文档和集合的连接操作,这种折中的方式在很多场景下间接实现了多文档事务的特性。

  在MongoDB

,> db操作。adminCommand ({getParameter: 1、featureCompatibilityVersion: 1})   

更多信息>空白runTransactionWithRetry (Runnable事务){   而(真){   尝试{   transactional.run ();   打破;   }捕捉(MongoException e) {   system . out。println(“交易流产。发现异常时事务。”);      如果(e.hasErrorLabel (MongoException.TRANSIENT_TRANSACTION_ERROR_LABEL)) {   system . out。println (“TransientTransactionError,中止事务和重试…”);   继续;   其他}{   把e;   }   }   }   }   

提交操作可以被重做重试提交操作

  

提交操作本身是可以被重做的。如果事务在提交过程中遇到错误,驱动会自动忽略<代码> retryWrites>   

commit操作的事情写操作。如果提交操作操作遇到错误,MongoDB司机重试操作一次不管<代码> retryWrites>

  

如果事务提交的过程中发生错误,MongoDB会返回一个包含<代码> errorLabels> errorLabels> “UnknownTransactionCommitResult”元素,标识这个事务可以被重新提交

  

如果提交操作遇到错误,MongoDB返回一个错误的<代码> errorLabels> errorLabels> “UnknownTransactionCommitResult”作为一个元素和提交操作可以重试。

  

尽管MongoDB驱动提供了一次事务重新提交机制,应用方面仍应该设计一个方法去处理事务提交过程中爆出的错误。

  

除了单一重试行为MongoDB提供的驱动程序,应用程序应该采取措施来处理<代码>“UnknownTransactionCommitResult”在事务提交错误。

  

仍以JAVA为例:

  
 <代码类="语言java ">空白commitWithRetry (ClientSession ClientSession) {
  而(真){
  尝试{
  clientSession.commitTransaction ();
  system . out。println(“事务犯”);
  打破;
  }捕捉(MongoException e) {//可以重试提交
  如果(e.hasErrorLabel (MongoException.UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)) {
  system . out。println (“UnknownTransactionCommitResult,重试提交操作…”);
  继续;
  其他}{
  system . out。println(“异常期间提交…”);
  把e;
  }
  }
  }
  } 
  

事务与提交操作的重做重试事务和提交操作

  

将上文两个逻辑结合起来,看下面的例程:(JAVA)

  
 <代码类="语言java ">空白runTransactionWithRetry (Runnable事务){
  而(真){
  尝试{
  transactional.run ();
  打破;
  }捕捉(MongoException e) {
  system . out。println(“交易流产。发现异常时事务。”);
  
  如果(e.hasErrorLabel (MongoException.TRANSIENT_TRANSACTION_ERROR_LABEL)) {
  system . out。println (“TransientTransactionError,中止事务和重试…”);
  继续;
  其他}{
  把e;
  }
  }
  }
  }
  
  空白commitWithRetry (ClientSession ClientSession) {
  而(真){
  尝试{
  clientSession.commitTransaction ();
  system . out。println(“事务犯”);
  打破;
  }捕捉(MongoException e) {//可以重试提交
  如果(e.hasErrorLabel (MongoException.UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)) {
  system . out。println (“UnknownTransactionCommitResult,重试提交操作…”);
  继续;
  其他}{
  system . out。println(“异常期间提交…”);
  把e;
  }
  }
  }
  }
  
  空白updateEmployeeInfo () {
  MongoCollection

【MongoDB】事务