热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

总结一下让pymongo支持事务

一.升级mongo到4.0以上安装mongodb4.0参考了这篇文章步骤1:在终端输入GPK码sudoapt-keyadv--keyserverhkp:keyserver.ubun

一. 升级 mongo 到 4.0 以上

安装mongodb 4.0 参考了这篇文章

步骤1:在终端输入GPK码

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4

步骤2:添加mongoDB源
  • Ubuntu 18.04 LTS:
    echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb.list
  • Ubuntu 16.04 LTS:
    echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb.list
步骤3:安装 mongodb server

sudo apt update
sudo apt install mongodb-org (这种方法我没有安装成功,用的是下面的指定版本,成功了)
也可以直接安装指定版本的mongoDB
sudo apt install mongodb-org=4.0.1 mongodb-org-server=4.0.1 mongodb-org-shell=4.0.1 mongodb-org-mOngos=4.0.1 mongodb-org-tools=4.0.1

步骤4: 开启服务

service mongod start
兼容性检查,进入mongo终端,输入
db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
如果版本号小于4.0, 如下:

"featureCompatibilityVersion" : {
"version" : "3.6"
}

则运行下面命令提高兼容性:
db.adminCommand( { setFeatureCompatibilityVersion: "4.0" } )
在此运行检查兼容性命令,会出现如下,表示成功。

"featureCompatibilityVersion" : {
"version" : "4.0"
}

步骤5:验证 mongoDB 版本

mongod --version
结果 :

db version v4.0.1 git version: 54f1582fc6eb01de4d4c42f26fc133e623f065fb
OpenSSL version: OpenSSL 1.0.2g 1 Mar 2016
allocator: tcmalloc
modules: none
build environment:
distmod: ubuntu1604
distarch: x86_64
target_arch: x86_64

二. 创建副本集

数据库必须工作在副本集或者分片模式.单机模式是不支持事务的.

  • 如果之前开启了 mongo 服务,先关闭 service mongod stop
  • 如果27017端口还是被占用,那就杀死该进程 1. 查找进程号 lsof -i:27017 2. sudo kill -9 pid
  • 以下面这种方式启动 mongo 服务:mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip 0.0.0.0 注意 /srv/mongodb/db0/ 文件夹要先手动创建
    运行上述命令后会出现以下:

root@XXX:~# mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0
2019-01-15T15:33:03.536+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2019-01-15T15:33:03.542+0800 I CONTROL [initandlisten] MongoDB starting : pid=22484 port=27017 dbpath=/srv/mongodb/db0 64-bit host=JXC
2019-01-15T15:33:03.542+0800 I CONTROL [initandlisten] db version v4.0.1
2019-01-15T15:33:03.542+0800 I CONTROL [initandlisten] git version: 54f1582fc6eb01de4d4c42f26fc133e623f065fb
2019-01-15T15:33:03.542+0800 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.2g 1 Mar 2016
2019-01-15T15:33:03.542+0800 I CONTROL [initandlisten] allocator: tcmalloc
2019-01-15T15:33:03.542+0800 I CONTROL [initandlisten] modules: none
2019-01-15T15:33:03.542+0800 I CONTROL [initandlisten] build environment:
2019-01-15T15:33:03.542+0800 I CONTROL [initandlisten] distmod: ubuntu1604
2019-01-15T15:33:03.542+0800 I CONTROL [initandlisten] distarch: x86_64
2019-01-15T15:33:03.542+0800 I CONTROL [initandlisten] target_arch: x86_64
2019-01-15T15:33:03.542+0800 I CONTROL [initandlisten] options: { net: { bindIp: "0.0.0.0", port: 27017 }, replication: { replSet: "rs0" }, storage: { dbPath: "/srv/mongodb/db0" } }
2019-01-15T15:33:03.543+0800 I STORAGE [initandlisten] Detected data files in /srv/mongodb/db0 created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
2019-01-15T15:33:03.543+0800 I STORAGE [initandlisten]
2019-01-15T15:33:03.543+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2019-01-15T15:33:03.543+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2019-01-15T15:33:03.543+0800 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=488M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),
2019-01-15T15:33:04.320+0800 I STORAGE [initandlisten] WiredTiger message [1547537584:320685][22484:0x7f18251bfa00], txn-recover: Main recovery loop: starting at 9/5888
2019-01-15T15:33:04.429+0800 I STORAGE [initandlisten] WiredTiger message [1547537584:429313][22484:0x7f18251bfa00], txn-recover: Recovering log 9 through 10
2019-01-15T15:33:04.497+0800 I STORAGE [initandlisten] WiredTiger message [1547537584:497288][22484:0x7f18251bfa00], txn-recover: Recovering log 10 through 10
2019-01-15T15:33:04.556+0800 I STORAGE [initandlisten] WiredTiger message [1547537584:556247][22484:0x7f18251bfa00], txn-recover: Set global recovery timestamp: 0
2019-01-15T15:33:04.587+0800 I RECOVERY [initandlisten] WiredTiger recoveryTimestamp. Ts: Timestamp(0, 0)
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten]
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten]
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten]
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten]
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 7856 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten]
2019-01-15T15:33:04.611+0800 I FTDC [initandlisten] Initializing full-time diagnostic data capture with directory '/srv/mongodb/db0/diagnostic.data'
2019-01-15T15:33:04.612+0800 I REPL [initandlisten] Did not find local voted for document at startup.
2019-01-15T15:33:04.613+0800 I REPL [initandlisten] Rollback ID is 1
2019-01-15T15:33:04.613+0800 I REPL [initandlisten] Did not find local replica set configuration document at startup; NoMatchingDocument: Did not find replica set configuration document in local.system.replset
2019-01-15T15:33:04.613+0800 I NETWORK [initandlisten] waiting for connections on port 27017
2019-01-15T15:33:04.614+0800 I CONTROL [LogicalSessionCacheRefresh] Sessions collection is not set up; waiting until next sessions refresh interval: Replication has not yet been configured
2019-01-15T15:33:04.614+0800 I CONTROL [LogicalSessionCacheReap] Sessions collection is not set up; waiting until next sessions reap interval: Replication has not yet been configured

此时工作还没有完成,还不能使用 mongo 事务,需要进入 mongo 终端
mongo命令进入

root@XXX:~# mongo
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1
Server has startup warnings:
2019-01-15T15:33:03.543+0800 I STORAGE [initandlisten]
2019-01-15T15:33:03.543+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2019-01-15T15:33:03.543+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten]
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten]
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten]
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten]
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 7856 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.
2019-01-15T15:33:04.599+0800 I CONTROL [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).
The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.
To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
>

运行如下命令:
rs.initiate({ _id: "rs0", version: 1, members: [ { _id: 0, host: "mongo所在主机ip:27017" } ] })
结果:

{
"ok" : 1,
"operationTime" : Timestamp(1547539555, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1547539555, 1),
"signature" : {
"hash" : BinData(0,"#########="),
"keyId" : NumberLong(0)
}
}
}

如过以上所有过程都没问题,则可以用 pymongo 尝试事务操作

注意:事务操作不会自己建立 database 和 collection,这两个需要自己手动创建
且 pymongo 版本 3.7 以上
操作

  • 没有错误, t1 和 t2 都会插入成功

cOnns= pymongo.MongoClient("mongo服务ip", 27017)
t1 = conns["test"]['t1']
t2 = conns["test"]['t2']
with conns.start_session(causal_cOnsistency=True) as session:
"""事物必须在session下执行,with保证了session的正常关闭"""
with session.start_transaction():
"""一旦出现异常会自动调用session.abort_transaction()"""
t1.insert_one(document={"city": "beijing"}, session=session) # 注意多了session这个参数
t2.insert_one(document={"city": "tianjin"}, session=session)

  • 出现错误,t1 和 t2 都不会插入成功

cOnns= pymongo.MongoClient("mongo服务ip", 27017)
t1 = conns["test"]['t1']
t2 = conns["test"]['t2']
with conns.start_session(causal_cOnsistency=True) as session:
"""事物必须在session下执行,with保证了session的正常关闭"""
with session.start_transaction():
"""一旦出现异常会自动调用session.abort_transaction()"""
t1.insert_one(document={"city": "beijing"}, session=session) # 注意多了session这个参数
raise Exception("haha") # 制造一个错误, t1和t2的插入都不会成功.
t2.insert_one(document={"city": "tianjin"}, session=session)

推荐阅读
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了在MacOS系统上安装MySQL的步骤,并详细说明了如何设置MySQL服务的开机启动和如何修改MySQL的密码。通过下载MySQL的macos版本并按照提示一步一步安装,在系统偏好设置中可以找到MySQL的图标进行设置。同时,还介绍了通过终端命令来修改MySQL的密码的具体操作步骤。 ... [详细]
author-avatar
莪鈈稀罕rn
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有