網站首頁 編程語言 正文
事務簡介
事務是數據庫中處理的邏輯單元,每個事務中包括一個或多個數據庫操作,既可以是讀操作,也可以是寫操作。
ACID 是一個“真正”事務所需要具備的一組屬性集合,指的是原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)。
原子性指的是,事務中的所有操作要么都被應用,要么都不被應用。
一致性指的是,如果數據庫在執行事務之前是一致性狀態,那么在事務執行之后,無論事務是否成功,數據庫也應該是一致性狀態。
隔離性指的是,即使數據庫中有多個事務并發地執行,各個事務之間也不會互相影響,并且在并發狀態下執行的事務和串行執行的事務產生的結果完全相同。
持久性指的是,在事務成功提交了之后,事務所變更的數據一定會保存起來,而不會因為任何故障導致數據丟失。
當數據庫滿足所有這些屬性,并且只有成功的事務才會被處理時,它就被稱為是符合 ACID 的數據庫。
如何使用事務
事務語法
MongoDB 提供了兩種 API 來使用事務:
- 核心 API,與關系數據庫類似的語法(如?
start_transaction
?和?commit_transaction
) - 回調 API,這是使用事務的推薦方法
核心 API 不為大多數錯誤提供重試邏輯,它要求開發人員為操作、事務提交函數以及所需的任何重試和錯誤邏輯手動編寫代碼。
與核心 API 不同,回調 API 提供了一個單獨的函數,該函數封裝了大量功能,包括啟動與指定邏輯會話關聯的事務、執行作為回調函數提供的函數以及提交事務(或在出現錯誤時中止)。此函數還包含了處理提交錯誤的重試邏輯。
在 MongoDB 4.2 中添加回調 API 是為了簡化使用事務的應用程序開發,也便于添加處理事務錯誤的應用程序重試邏輯。
API 區別
核心 API | 回調 API |
---|---|
需要顯式調用才能啟動和提交事務 | 啟動事務、執行指定的操作,然后提交(或在發生錯誤時終止) |
不包含?TransientTransactionError ?和?UnknownTransactionCommitResult ?的錯誤處理邏輯,而是提供了為這些錯誤進行自定義處理的靈活性 |
自動為?TransientTransactionError ?和?UnknownTransactionCommitResult ?提供錯誤處理邏輯 |
要求為特定事務將顯式的邏輯會話傳遞給 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
?參數。實際上會使用?maxTimeMS
?和?transactionLifetimeLimitSeconds
?中的更小值。
事務等待獲取其操作所需鎖的默認最大時間是 5 毫秒。可以通過修改由?maxTransactionLockRequestTimeoutMillis
?參數控制的限制來增加。如果事務在此期間無法獲得鎖,則該事務會被中止。
當?maxTransactionLockRequestTimeoutMillis
?設置為?0
?時,意味著如果事務無法立即獲得所需的所有鎖,則該事務會被中止。設置為?-1
?將使用由?maxTimeMS
?參數所指定的特定于操作的超時時間。
oplog 大小限制
MongoDB 會創建出與事務中寫操作數量相同的 oplog 條目。
但是,每個 oplog 條目必須在 16MB 的 BSON 文檔大小限制之內。
原文鏈接:https://www.cnblogs.com/fatedeity/p/16925314.html
相關推薦
- 2023-01-21 C++?STL中的常用遍歷算法分享_C 語言
- 2022-07-09 ABP基礎架構深入探索_基礎應用
- 2022-05-24 用BAT創建文件夾文件及回顯環境變量的問題_DOS/BAT
- 2022-08-26 C++類模板實戰之vector容器的實現_C 語言
- 2022-06-22 Git文件常用操作總結及拓展_其它綜合
- 2022-10-08 Pandas數據分析之pandas文本處理_python
- 2022-08-15 關于PL/SQL進行更新操作時卡死的解決辦法
- 2022-11-01 Golang中map的深入探究_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支