606 lines
26 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh">
<head>
<!-- 元数据 -->
<meta charset="utf-8">
<link rel="icon" href="https://2-cdn.ianxia.com/images/avatar/common.png">
<title>MongoDB 事务前的准备工作 | Code The World</title>
<meta name="author" content="Bigsk" />
<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="robots" content="index,follow" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
<meta name="format-detection" content="telphone=no, email=no" />
<meta name="keywords" content="技术" />
<meta name="description" content="导言前段时间在一个项目中由于存在竞争导致的对原子性一致性的要求非常高且使用到了MongoDB。我们都知道解决原子性问题需要使用到数据库的事物功能但MongoDB的事物处理机制稍有特殊在此过程中踩了不少坑故写此文予以记录。 正文一、启用安全验证与创建密钥MongoDB的事物处理建立在副本集上而副本集需要安全验证与密钥进行安全验证故需要先对MongoDB进行安全配置并关联密钥 首先创建管">
<meta property="og:type" content="article">
<meta property="og:title" content="MongoDB 事务前的准备工作">
<meta property="og:url" content="https://blog.ianxia.com/2025/03/31/MongoDB-%E4%BA%8B%E5%8A%A1%E5%89%8D%E7%9A%84%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C/index.html">
<meta property="og:site_name" content="Code The World">
<meta property="og:description" content="导言前段时间在一个项目中由于存在竞争导致的对原子性一致性的要求非常高且使用到了MongoDB。我们都知道解决原子性问题需要使用到数据库的事物功能但MongoDB的事物处理机制稍有特殊在此过程中踩了不少坑故写此文予以记录。 正文一、启用安全验证与创建密钥MongoDB的事物处理建立在副本集上而副本集需要安全验证与密钥进行安全验证故需要先对MongoDB进行安全配置并关联密钥 首先创建管">
<meta property="og:locale">
<meta property="article:published_time" content="2025-03-31T06:56:50.000Z">
<meta property="article:modified_time" content="2025-03-31T07:06:34.359Z">
<meta property="article:author" content="Bigsk">
<meta property="article:tag" content="技术">
<meta name="twitter:card" content="summary">
<!-- 站点验证相关 -->
<!-- 样式表文件 -->
<link rel="stylesheet" id="kratos-css" href="/css/kratosr.min.css" media="all"></script>
<link rel="stylesheet" id="darkmode-css" href="/css/kr-color-dark.min.css" media="(prefers-color-scheme: dark)"></script>
<script src="/js/kr-dark.min.js"></script>
<link rel="stylesheet" id="highlight-css" href="/css/highlight/night-eighties.min.css" media="all"></script>
<link rel="stylesheet" id="fontawe-css" href="/vendors/font-awesome@4.7.0/css/font-awesome.min.css" media="all"></script>
<link rel="stylesheet" id="nprogress-css" href="/vendors/nprogress@0.2.0/nprogress.css" media="all"></script>
<link rel="stylesheet" href="/vendors/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css"></script>
<!-- 不得不预先加载的一些JS文件 -->
<script src="/vendors/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="/vendors/qrcode_js@1.0.0/qrcode.min.js"></script>
<style>
</style>
<meta name="generator" content="Hexo 6.3.0"></head>
<body class="custom-background">
<div id="kratos-wrapper">
<div id="kratos-page">
<div id="kratos-header">
<header id="kratos-desktop-topnav" class="kratos-topnav">
<div class="container">
<div class="nav-header">
<nav id="kratos-menu-wrap">
<ul id="kratos-primary-menu" class="sf-menu">
<li>
<a target="_blank" rel="noopener" href="https://www.ianxia.com">
<i class="fa fa-home"></i>
首页
</a>
</li>
<li>
<a target="_blank" rel="noopener" href="https://demo.ianxia.com">
<i class="fa fa-bug"></i>
DEMO
</a>
</li>
<li>
<a target="_blank" rel="noopener" href="https://adsb.ianxia.com">
<i class="fa fa-plane"></i>
ADS-B
</a>
</li>
<li>
<a target="_blank" rel="noopener" href="https://tools.ianxia.com">
<i class="fa fa-wrench"></i>
小工具
</a>
</li>
<li>
<a href="/">
<i class="fa fa-cubes"></i>
博客
</a>
</li>
<li>
<a href="/links">
<i class="fa fa-link"></i>
友情链接
</a>
</li>
</ul>
</nav>
</div>
</div>
</header>
<header id="kratos-mobile-topnav" class="kratos-topnav">
<div class="container">
<div class="color-logo"><a href="/">Code The World</a></div>
<div class="nav-toggle">
<a class="kratos-nav-toggle js-kratos-nav-toggle">
<i></i>
</a>
</div>
</div>
</header>
</div>
<div class="kratos-start kratos-hero-2">
<!-- <div class="kratos-overlay"></div> -->
<div class="kratos-cover kratos-cover-2 text-center">
<div class="desc desc2 animate-box">
<a href="/">
<h2>Code The World</h2> <br />
<span>Codice est quasi poem a.</span>
</a>
</div>
</div>
</div>
<div id="kratos-blog-post">
<div class="container">
<div id="main" class="row">
<section class="col-md-8">
<article itemscope itemtype="https://schema.org/Article">
<link itemprop="mainEntityOfPage" href="https://blog.ianxia.com/2025/03/31/MongoDB-%E4%BA%8B%E5%8A%A1%E5%89%8D%E7%9A%84%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C/">
<div class="kratos-hentry kratos-post-inner clearfix">
<header class="kratos-entry-header">
<h1 class="kratos-entry-title text-center" itemprop="name headline">MongoDB 事务前的准备工作</h1>
<ul class="kratos-post-meta text-center">
<li><time datetime="2025-03-31T06:56:50.000Z" itemprop="datePublished"><i class="fa fa-calendar"></i> 2025-03-31</time></li>
<li itemprop="author" itemscope itemtype="https://schema.org/Person">
<i class="fa fa-user"></i> 作者 <span itemprop="name">Bigsk</span>
</li>
<li>
<i class="fa fa-edit"></i>
676
</li>
</ul>
</header>
<div class="kratos-post-content">
<div id="expire-alert" class="alert alert-warning hidden" role="alert">
<div class="icon"><i class="fa fa-warning"></i></div>
<div class="text"><p>本文最后编辑于 <time datetime="1743404794359"></time> 前,其中的内容可能需要更新。</p></div>
</div>
<hr />
<div itemprop="articleBody"><h2 id="导言"><a href="#导言" class="headerlink" title="导言"></a>导言</h2><p>前段时间在一个项目中由于存在竞争导致的对原子性一致性的要求非常高且使用到了MongoDB。<br>我们都知道解决原子性问题需要使用到数据库的事物功能但MongoDB的事物处理机制稍有特殊<br>在此过程中踩了不少坑,故写此文予以记录。</p>
<h2 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h2><h3 id="一、启用安全验证与创建密钥"><a href="#一、启用安全验证与创建密钥" class="headerlink" title="一、启用安全验证与创建密钥"></a>一、启用安全验证与创建密钥</h3><p>MongoDB的事物处理建立在副本集上而副本集需要安全验证与密钥进行安全验证<br>故需要先对MongoDB进行安全配置并关联密钥</p>
<p>首先创建管理员用户,具体步骤网上很多,自行查阅。</p>
<p>随后创建密钥:</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">openssl rand -base64 756 &gt; /path/to/mongodb-keyfile</span><br><span class="line">chmod 600 /path/to/mongodb-keyfile # Restrict permissions</span><br></pre></td></tr></table></figure>
<p>在MongoDB的配置文件<code>mongod.conf</code>中加入以下内容:</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">security:</span><br><span class="line"> authorization: enabled</span><br><span class="line"> keyFile: /path/to/mongodb-keyfile # Path to your key file</span><br></pre></td></tr></table></figure>
<p>重启MongoDB</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl restart mongod</span><br></pre></td></tr></table></figure>
<h3 id="二、启用副本集"><a href="#二、启用副本集" class="headerlink" title="二、启用副本集"></a>二、启用副本集</h3><p>MongoDB的事物处理建立在副本集机制上故需要启用副本集来支持事物处理</p>
<p>在MongoDB配置文件<code>mongod.conf</code>中加入:</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">replication:</span><br><span class="line"> replSetName: &quot;rs0&quot;</span><br></pre></td></tr></table></figure>
<p>进入MongoShell初始化副本集</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rs.initiate()</span><br></pre></td></tr></table></figure>
<p>大功告成。</p>
</div>
</div>
<div class="kratos-copyright text-center clearfix">
<h5 itemprop="copyrightNotice">本作品采用 <a rel="license nofollow" target="_blank" href="https://creativecommons.org/licenses/by-sa/4.0/">知识共享署名-相同方式共享 4.0 国际许可协议</a> 进行许可</h5>
</div>
<footer class="kratos-entry-footer clearfix">
<div class="post-like-donate text-center clearfix" id="post-like-donate">
<a class="share" href="javascript:;"><i class="fa fa-share-alt"></i> 分享</a>
<div class="share-wrap" style="display: none;">
<div class="share-group">
<a href="javascript:;" class="share-plain qq" onclick="share('qq');" rel="nofollow">
<div class="icon-wrap">
<i class="fa fa-qq"></i>
</div>
</a>
<a href="javascript:;" class="share-plain qzone" onclick="share('qzone');" rel="nofollow">
<div class="icon-wrap">
<i class="fa fa-star"></i>
</div>
</a>
<a href="javascript:;" class="share-plain weixin pop style-plain" rel="nofollow">
<div class="icon-wrap">
<i class="fa fa-weixin"></i>
</div>
<div class="share-int">
<div class="qrcode" id="wechat-qr"></div>
<p>打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮</p>
</div>
</a>
<a href="javascript:;" class="share-plain weibo" onclick="share('weibo');" rel="nofollow">
<div class="icon-wrap">
<i class="fa fa-weibo"></i>
</div>
</a>
<a href="javascript:;" class="share-plain facebook style-plain" onclick="share('facebook');" rel="nofollow">
<div class="icon-wrap">
<i class="fa fa-facebook"></i>
</div>
</a>
<a href="javascript:;" class="share-plain twitter style-plain" onclick="share('twitter');" rel="nofollow">
<div class="icon-wrap">
<i class="fa fa-twitter"></i>
</div>
</a>
</div>
<script type="text/javascript">
$(()=>{
new QRCode("wechat-qr", {
text: "https://blog.ianxia.com/2025/03/31/MongoDB-%E4%BA%8B%E5%8A%A1%E5%89%8D%E7%9A%84%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C/",
width: 150,
height: 150,
correctLevel : QRCode.CorrectLevel.H
});
});
function share(dest) {
const qqBase = "https://connect.qq.com/widget/shareqq/index.html?";
const weiboBase = "https://service.weibo.com/share/share.php?";
const qzoneBase = "https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?";
const facebookBase = "https://www.facebook.com/sharer/sharer.php?";
const twitterBase = "https://twitter.com/intent/tweet?";
const hostUrl = "https://blog.ianxia.com/2025/03/31/MongoDB-%E4%BA%8B%E5%8A%A1%E5%89%8D%E7%9A%84%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C/";
const title = "「MongoDB 事务前的准备工作」";
const excerpt = `导言前段时间在一个项目中由于存在竞争导致的对原子性一致性的要求非常高且使用到了MongoDB。我们都知道解决原子性问题需要使用到数据库的事物功能但MongoDB的事物处理机制稍有特殊在此过程中踩了不少坑故写此文予以记录。
正文...`;
let _URL;
switch (dest) {
case "qq" : _URL = qqBase+"url="+hostUrl+"&title="+title+"&desc=&summary="+excerpt+"&site=cxpy"; break;
case "weibo" : _URL = weiboBase+"url="+hostUrl+"&title="+title+excerpt; break;
case "qzone" : _URL = qzoneBase+"url="+hostUrl+"&title="+title+"&desc=&summary="+excerpt+"&site=cxpy"; break;
case "facebook" : _URL = facebookBase+"u="+hostUrl; break;
case "twitter" : _URL = twitterBase+"text="+title+excerpt+"&url="+hostUrl; break;
}
window.open(_URL);
};
</script>
</div>
</div>
<div class="footer-tag clearfix">
<div class="pull-left">
<i class="fa fa-tags"></i>
<a class="tag-none-link" href="/tags/%E6%8A%80%E6%9C%AF/" rel="tag">技术</a>
</div>
<div class="pull-date">
<time datetime="2025-03-31T07:06:34.359Z" itemprop="dateModified">最后编辑2025-03-31</time>
</div>
</div>
</footer>
</div>
<nav class="navigation post-navigation clearfix" role="navigation">
<div class="nav-previous clearfix">
<a title=" 利用Linux小主机和SDR搭建APRS iGate" href="/2024/11/25/利用Linux小主机和SDR搭建APRS-iGate/">&lt; 上一篇</a>
</div>
</nav>
</article>
</section>
<section id="kratos-widget-area" class="col-md-4 hidden-xs hidden-sm">
<!-- 文章和页面根据splitter来分割没有的话就从头开始设置为sticky -->
<aside id="krw-about" class="widget widget-kratos-about clearfix">
<div class="photo-background"></div>
<div class="photo-wrapper clearfix">
<div class="photo-wrapper-tip text-center">
<img class="about-photo" src="https://2-cdn.ianxia.com/images/avatar/common.png" loading="lazy" decoding="auto" />
</div>
</div>
<div class="textwidget">
<p class="text-center">Codice est quasi poem a.</p>
</div>
<div class="site-meta">
<a class="meta-item" href="/archives/">
<span class="title">
文章
</span>
<span class="count">
26
</span>
</a>
<a class="meta-item" href="/categories/">
<span class="title">
分类
</span>
<span class="count">
3
</span>
</a>
<a class="meta-item" href="/tags/">
<span class="title">
标签
</span>
<span class="count">
3
</span>
</a>
</div>
</aside>
<div class="sticky-area">
<aside id="krw-categories" class="widget widget-kratos-categories clearfix">
<h4 class="widget-title"><i class="fa fa-folder"></i>分类目录</h4>
<ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%8A%80%E6%9C%AF/">技术</a><span class="category-list-count">17</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%91%84%E5%BD%B1/">摄影</a><span class="category-list-count">7</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%B5%84%E6%BA%90/">资源</a><span class="category-list-count">2</span></li></ul>
</aside>
<aside id="krw-tags" class="widget widget-kratos-tags clearfix">
<h4 class="widget-title"><i class="fa fa-tags"></i>标签聚合</h4>
<div class="tag-clouds">
<a href="/tags/%E6%8A%80%E6%9C%AF/" style="font-size: 0.8em;">技术</a> <a href="/tags/%E6%91%84%E5%BD%B1/" style="font-size: 0.7em;">摄影</a> <a href="/tags/%E8%B5%84%E6%BA%90/" style="font-size: 0.6em;">资源</a>
</div>
</aside>
<aside id="krw-posts" class="widget widget-kratos-posts">
<h4 class="widget-title"><i class="fa fa-file"></i>最新文章</h4>
<div class="tab-content">
<ul class="list-group">
<a class="list-group-item" href="/2025/03/31/MongoDB-%E4%BA%8B%E5%8A%A1%E5%89%8D%E7%9A%84%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C/"><i class="fa fa-book"></i> MongoDB 事务前的准备工作</a>
<a class="list-group-item" href="/2024/11/25/%E5%88%A9%E7%94%A8Linux%E5%B0%8F%E4%B8%BB%E6%9C%BA%E5%92%8CSDR%E6%90%AD%E5%BB%BAAPRS-iGate/"><i class="fa fa-book"></i> 利用Linux小主机和SDR搭建APRS iGate</a>
<a class="list-group-item" href="/2024/10/30/Python%E8%AF%81%E4%B9%A6%E9%93%BE%E5%87%BA%E9%97%AE%E9%A2%98%E5%AF%BC%E8%87%B4%E7%9A%84%E6%A8%A1%E5%9D%97%E5%85%A8%E9%83%A8%E6%8A%A5%E9%94%99/"><i class="fa fa-book"></i> Python证书链出问题导致的模块全部报错</a>
<a class="list-group-item" href="/2024/10/09/Mac%E5%AE%89%E8%A3%85%E8%BD%AF%E4%BB%B6%E6%97%B6%E6%8F%90%E7%A4%BA%E5%B7%B2%E6%8D%9F%E5%9D%8F%E7%9A%84%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/"><i class="fa fa-book"></i> Mac安装软件时提示已损坏的解决办法</a>
<a class="list-group-item" href="/2023/07/18/%E6%91%84%E5%BD%B1%E4%BD%9C%E5%93%81-Field/"><i class="fa fa-book"></i> 摄影作品Field</a>
</ul>
</div>
</aside>
</div>
</section>
</div>
</div>
</div>
<footer>
<div id="footer" >
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3 footer-list text-center">
<ul class="kratos-social-icons">
<!-- Keep for compatibility -->
<!-- New links -->
</ul>
<ul class="kratos-copyright">
<div>
<li>&copy; 2025 Bigsk 版权所有.</li><br>
<li>本站已运行<span id="span_dt">Loading...</span></li><br>
<li>本站支持 IPv6 访问</li><br>
</div>
<!--
<div>
</div>
<div>
</div>
-->
<div><br><br></div>
</ul>
</div>
</div>
</div>
<div class="kr-tool text-center">
<div class="tool">
<div class="box search-box">
<a href="/search/">
<span class="fa fa-search"></span>
</a>
</div>
<div class="box theme-box" id="darkmode-switch">
<span class="fa fa-adjust"></span>
</div>
</div>
<div class="box gotop-box">
<span class="fa fa-chevron-up"></span>
</div>
</div>
</div>
</footer>
</div>
</div>
<script defer src="/vendors/bootstrap@3.3.4/dist/js/bootstrap.min.js"></script>
<script defer src="/vendors/nprogress@0.2.0/nprogress.js"></script>
<script>
if (!window.kr) {
window.kr = {};
}
window.kr.notMobile = (!(navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)));
window.kr.siteRoot = "/";
</script>
<script async src="/js/candy.min.js"></script>
<script defer src="/vendors/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>
<script defer src="/js/kratosr.min.js"></script>
<script defer src="/js/pjax.min.js"></script>
<!-- Extra support for third-party plguins -->
</body>
</html>