MongoDB - 事務支持

来源:https://www.cnblogs.com/fatedeity/archive/2022/11/25/16925314.html
-Advertisement-
Play Games

在 4.2 版本及更高版本中,MongoDB 提供了事務的支持,並且在其是分散式資料庫的基礎上,提供了支持跨多個操作、集合、資料庫、文檔和分片的 ACID 事務。 ...


事務簡介

事務是資料庫中處理的邏輯單元,每個事務中包括一個或多個資料庫操作,既可以是讀操作,也可以是寫操作。

ACID 是一個“真正”事務所需要具備的一組屬性集合,指的是原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)。

原子性指的是,事務中的所有操作要麼都被應用,要麼都不被應用。

一致性指的是,如果資料庫在執行事務之前是一致性狀態,那麼在事務執行之後,無論事務是否成功,資料庫也應該是一致性狀態。

隔離性指的是,即使資料庫中有多個事務併發地執行,各個事務之間也不會互相影響,並且在併發狀態下執行的事務和串列執行的事務產生的結果完全相同。

持久性指的是,在事務成功提交了之後,事務所變更的數據一定會保存起來,而不會因為任何故障導致數據丟失。

當資料庫滿足所有這些屬性,並且只有成功的事務才會被處理時,它就被稱為是符合 ACID 的資料庫。

如何使用事務

事務語法

MongoDB 提供了兩種 API 來使用事務:

  • 核心 API,與關係資料庫類似的語法(如 start_transactioncommit_transaction
  • 回調 API,這是使用事務的推薦方法

核心 API 不為大多數錯誤提供重試邏輯,它要求開發人員為操作、事務提交函數以及所需的任何重試和錯誤邏輯手動編寫代碼。

與核心 API 不同,回調 API 提供了一個單獨的函數,該函數封裝了大量功能,包括啟動與指定邏輯會話關聯的事務、執行作為回調函數提供的函數以及提交事務(或在出現錯誤時中止)。此函數還包含了處理提交錯誤的重試邏輯。

在 MongoDB 4.2 中添加回調 API 是為了簡化使用事務的應用程式開發,也便於添加處理事務錯誤的應用程式重試邏輯。

API 區別

核心 API 回調 API
需要顯式調用才能啟動和提交事務 啟動事務、執行指定的操作,然後提交(或在發生錯誤時終止)
不包含 TransientTransactionErrorUnknownTransactionCommitResult 的錯誤處理邏輯,而是提供了為這些錯誤進行自定義處理的靈活性 自動為 TransientTransactionErrorUnknownTransactionCommitResult 提供錯誤處理邏輯
要求為特定事務將顯式的邏輯會話傳遞給 API 要求為特定事務將顯式的邏輯會話傳遞給 API

實際使用

在一個 Python 的例子當中,使用核心 API 的偽代碼如下展示:

from pymongo import MongoClient
from pymongo.errors import ConnectionFailure, OperationFailure

# 顯式開啟一個事務會話
with client.start_session() as session:
    while True:
        try:
            with session.start_transaction():
                # 執行事務中的多個寫操作
                pass
                # 提交事務
                session.commit_transaction()
        except (ConnectionFailure, OperationFailure) as e:
            # 錯誤處理
            if e.has_error_label("UnknownTransactionCommitResult"):
                # 出現暫時性錯誤,則重試整個事務
                continue
            else:
                raise

使用核心 API 需要註意錯誤的捕捉和處理,而回調 API 就不需要註意這些,其偽代碼如下展示:

from pymongo import MongoClient

def session_callback(session):
    # 執行事務中的多個寫操作
    pass

# 顯式開啟一個事務會話
with client.start_session() as session:
    session.with_transaction(session_callback)

事務調優

在使用事務時,有幾個重要的參數需要註意。可以對它們進行調整,以確保應用程式能夠最佳地使用事務。

在 MongoDB 事務中有兩類主要的限制:

  • 第一類與事務的時間限制有關,控制特定事務可以運行多長時間、事務等待獲取鎖的時間以及所有事務將運行的最大長度
  • 第二類與 MongoDB 的 oplog 條目和單個條目的大小限制有關

時間限制

事務的預設最大運行時間是 1 分鐘。

可以通過在 mongod 實例級別上修改 transactionLifetimeLimitSeconds 的限制來增加。對於分片集群,必須在所有分片副本集成員上設置該參數。超過此時間後,事務將被視為已過期,並由定期運行的清理進程中止。清理進程每 60 秒或每 transactionLifetimeLimitSeconds/2 運行一次,以較小的值為準。

要顯式設置事務的時間限制,建議在提交事務時指定 maxTimeMS 參數。實際上會使用 maxTimeMStransactionLifetimeLimitSeconds 中的更小值。

事務等待獲取其操作所需鎖的預設最大時間是 5 毫秒。可以通過修改由 maxTransactionLockRequestTimeoutMillis 參數控制的限制來增加。如果事務在此期間無法獲得鎖,則該事務會被中止。

maxTransactionLockRequestTimeoutMillis 設置為 0 時,意味著如果事務無法立即獲得所需的所有鎖,則該事務會被中止。設置為 -1 將使用由 maxTimeMS 參數所指定的特定於操作的超時時間。

oplog 大小限制

MongoDB 會創建出與事務中寫操作數量相同的 oplog 條目。

但是,每個 oplog 條目必須在 16MB 的 BSON 文檔大小限制之內。

首發於「程式員翔仔」,點擊查看更多。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • WebDAV 是超文本傳輸協議 (HTTP) 的一組擴展,為 Internet 上電腦之間的編輯和文件管理提供了標準.利用這個協議用戶可以通過Web進行遠程的基本文件操作,如拷貝、移動、刪除等。 在IIS 7.0中,WebDAV是作為獨立擴展模塊,需要單獨進行下載,而IIS 7.5以及以上版本中... ...
  • .NET 現在支持跨平臺這件事情已經是眾所周知的特點了,雖然平臺整體支持跨平臺了,但是我們的代碼如果真的想要實現跨平臺運行其實還是有些小細節要註意的,今天想要記錄分享的就是關於 文件I/O操作時路徑的拼接問題。 在 Windows 環境下我們常見的路徑格式如下: D:\Software\AppDat ...
  • 本文是 《精讀 Mastering ABP Framework》 2.3 探索橫切關註點 - 使用授權和許可權系統 一節的擴充內容,重點探討了授權在分散式和微服務系統中遇到的挑戰,以及 ABP Framework 中採用的解決方案。 ...
  • 在所有監控 Linux 系統性能的工具中,Linux 的 top 命令是最好的也是最知名的一個(htop 是其升級版)。top 命令提供了 Linux 系統運行中的進程的動態實時視圖。它能顯示系統的概覽信息和 Linux 內核當前管理的進程列表。它顯示了大量的系統信息,如 CPU 使用、記憶體使用、交... ...
  • Docker和Docker-Compose簡單搭建與基本設置 一、搭建 Docker 1.第一步當然是看官方文檔 2.然後發現一大堆手動搭建的教程(然後小白就這樣搭建了),然後發現最後有一鍵搭建腳本 curl -fsSL https://get.docker.com -o get-docker.sh ...
  • 字元設備是按照位元組流進行讀寫操作的設備,讀寫數據是分先後順序的。常見的點燈、按鍵、 IIC、 SPI和LCD 等都是字元設備 。 字元設備驅動開發步驟: 總體思路: 定義並初始化一個字元設備 -1、定義一個字元設備—>struct cdev 2、定義並初始化字元設備的文件操作集—>struct fi ...
  • 使用的MCU型號為 AIR32F103CCT6. 通過工作機制和示例代碼, 說明如何使用AIR32自帶的記憶體實現簡單的語音錄製和播放功能, 以及使用 ADPCM 對音頻數據進行壓縮, 提高錄製時長. 通過這些機制, 可以快速擴充為實用的錄製設備, 例如外掛I2C或SPI存儲, 或提升無線傳輸的音質,... ...
  • Python基礎之MySQL資料庫 一、SQL語句常用查詢方法 前期數據準備 ​ 為了更加直觀的展示、演示SQL語句查詢關鍵字,需導入下列表格與記錄(數據) ​ 模擬公司,導入創建公司員工表,表內包含:ID、姓名、年齡、工作時間、崗位 創建人員表格: create table emp( id int ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...