事务事务/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】事务