加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL PK MongoDB:多文档事务支持,谁更友好?

发布时间:2018-12-31 09:13:26 所属栏目:MySql教程 来源:贺春旸
导读:MongoDB 4.0已经发布GA版本,并且有许多新功能和改进。在本文中,我们将重点关注主要功能,毫无疑问,这是对多文档ACID事务的支持。我们将围绕隔离级别、可重复读、幻读、事务冲突检测等主要功能,通过实验与MySQL一一做对比。 首先会简述介绍下ACID事务隔
副标题[/!--empirenews.page--]

MongoDB 4.0已经发布GA版本,并且有许多新功能和改进。在本文中,我们将重点关注主要功能,毫无疑问,这是对多文档ACID事务的支持。我们将围绕隔离级别、可重复读、幻读、事务冲突检测等主要功能,通过实验与MySQL一一做对比。

MySQL PK MongoDB:多文档事务支持,谁更友好?

MySQL PK MongoDB:多文档事务支持,谁更友好?

首先会简述介绍下ACID事务隔离级别,然后再步入测试主题正文。

原子性(Atomicity):事务包含的所有操作要么全部成功,要么全部失败,不存在成功一半的概念。典型例子“西方二元对立思想——非此即彼”:在二元逻辑体系中只存在两种逻辑值,就是对和错,或正和负,不存在既对又错或非正非负的其他状态。

一致性(Consistency):一个事务执行之前和执行之后都必须处于一致性状态。典型例子:“金龙,你借我5000元,下个月开支给你。”不论金龙用什么方式给我转账,分几次转,借钱结束后我银行卡里的余额增加5000元,金龙卡里少了5000元,不能突然蹦出来1万来。

隔离性(Isolation):数据库采用锁机制来实现事务的隔离性,当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。典型例子:“你去医院看病,要先到护士那里分诊排号,如果多个患者加塞儿同时进来,大夫就发飙了,出去排队,只能一个一个看”。

持久性(Durability):事务成功提交后,它对数据库所做的修改就永久保存下来,即使数据库崩溃,数据还能恢复到事务成功提交后的状态。典型例子:“你去ATM机取钱,结果ATM机故障了,你取出来了钱,卡里的余额不能没减。”

一、局限性与限制条件

1、多文档事务仅适用于副本集。

注:如果是单机,需切到副本集模式。

2、仅适用于WiredTiger存储引擎。

3、如果你的架构是分片Sharding模式,事务是不支持的。分布式事务计划在4.2版本里支持。

4、事务只支持CRUD操作,DDL、DCL操作不支持。

注:CRUD就是MySQL的DML,意思一样叫法不同而已。

5、事务无法在config、admin和local系统数据库中读取或写入。

MySQL PK MongoDB:多文档事务支持,谁更友好?

6、事务无法在system.*(系统集合)里写入。

7、不能有大事务写入,写入集不能超过16MB(类似MariaDB Galera Cluster写入集wsrep_max_ws_size限制),否则客户端直接报错。

注:如果有大事务,应该考虑将这些大事务拆分成若干块较小的事务。例如将大于2018年的状态值更改为1,应考虑循环1万条一批量更新,这一点跟MySQL玩法一样。

二、我们第一个事务

在开始事务之前,必须创建会话。事务不能在会话外运行。

  1. var session1 = db.getMongo().startSession()  
  2. var session2 = db.getMongo().startSession()  

Mongo Shell里引入了三个用于创建,提交和终止事务的新命令:

  1. session.startTransaction() 

在当前会话中启动事务

  1. session.commitTransaction() 

持久保存事务中的操作变更

  1. session.abortTransaction() 

终止事务操作所做的变更

MySQL PK MongoDB:多文档事务支持,谁更友好?

1、在test库创建t1表,并且插入4条数据。

MySQL PK MongoDB:多文档事务支持,谁更友好?

演示一

MySQL PK MongoDB:多文档事务支持,谁更友好?

演示二

MySQL PK MongoDB:多文档事务支持,谁更友好?

空闲事务受transactionLifetimeLimitSeconds参数影响,默认60秒。

可通过以下命令查看:

  1. db.adminCommand( { getParameter: 1, transactionLifetimeLimitSeconds: 1 } ) 

如果你想在线变更,可以通过下面的命令设置:

  1. db.adminCommand( { setParameter: 1, transactionLifetimeLimitSeconds: 30 } ) 

也可以写死在/etc/mongod.cnf配置文件里永久生效,格式如下:

  1. setParameter = transactionLifetimeLimitSeconds=30 

注:空闲事务是指当一个事务长时间未提交,那么这个连接就不能关闭,内存就不释放,,并发一大,导致DB连接数增多,就会对性能产生影响。默认是60秒,你可以根据自己的情况设定阈值。超过这个阈值,服务端自动杀死未提交的空闲事务。

MySQL PK MongoDB:多文档事务支持,谁更友好?

三、事务隔离性演示

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!