一、概述
MongoDB是一種非關係型數據庫,特點是高度可擴展、靈活、高性能、開源等。在MongoDB 4.0版本中,加入了事務(Transaction)功能,使得MongoDB可以支持像傳統關係型數據庫一樣工作。
事務是指一組原子操作,它們可以被視為一個整體,要麼全部成功,要麼全部失敗。MongoDB的事務是在一個集合內進行的,不支持跨多個集合或多個分片的事務。
二、事務的支持範圍
在MongoDB 4.0版本中,事務僅支持副本集和單節點,不支持分片集群。
三、事務的API
啟動一個事務的API是client.startSession(),該方法返回一個Session對象,每個Session對象都有自己的事務ID。
在Session對象內進行操作時,需要使用該Session對象。如果未指定Session對象,則不在事務中執行。
提交事務和回滾事務的API分別是session.commitTransaction()和session.abortTransaction()。
四、事務的例子
from pymongo import MongoClient client = MongoClient() db = client['test'] with client.start_session() as session: with session.start_transaction(): db.users.update_one({'name': 'Tom'}, {'$set': {'age': 25}}) db.orders.delete_one({'status': 'invalid'}) session.commit_transaction()
在這個例子中,我們使用with語句創建一個Session對象並啟動了一個事務。在事務中,我們更新了db.users集合中的一個文檔,並刪除了db.orders集合中狀態為’invalid’的文檔。在事務完成後,我們使用session.commit_transaction()將事務提交。
五、事務的隔離級別
事務的隔離級別指多個事務之間的可見性。在MongoDB中,事務的隔離級別有四種:
- Read uncommitted: 讀取未提交數據
- Read committed: 讀取已提交數據
- Repeatable read: 可重複讀
- Serializable: 可串行化
用戶可以使用以下語句設置隔離級別:
session.start_transaction(read_concern=ReadConcern('local'), write_concern=WriteConcern(w='majority'), read_preference=ReadPreference.PRIMARY)
其中read_concern指定了讀取事務的隔離級別,write_concern指定了寫入事務的隔離級別,read_preference指定了讀取數據的偏好。
六、事務的回滾和超時
事務可以通過session.abortTransaction()方法進行回滾。如果事務運行時間過長或過程中發生錯誤,可以使用session.abortTransaction()方法回滾事務。
事務默認情況下有60秒的超時時間,可以通過session.expire_after_seconds()方法重新設置超時時間。如果事務在超時前未能提交,將自動回滾。
七、結論
MongoDB 4.0版本中加入了事務功能,使得MongoDB可以支持事務,成為了一種更加全面的數據庫。在使用事務時,需要注意事務的支持範圍、API、隔離級別、回滾和超時等重要方面。
原創文章,作者:MKHVJ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/349517.html