MONGODB 事务从哪里开始,别再说Mongo没事务了 1 简单操作

介绍了MongoDB 4.0版本如何实现事务支持,包括原子性、一致性等特性,并提供了通过mongoshell进行事务操作的具体步骤。讨论了事务在NoSQL数据库中的应用及其可能带来的性能影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bd23042ff4db8e1f580288fd576aeaa9.png

关系型数据库对事务之间的关系是无法拆分的关系,提到关系型数据库最重要的解决的问题就是事务。MONGODB 之前被人一直无法在核心数据库上应用的时,被攻击的问题就是事务,事务中最重要的原子性,在MONGODB的多collection是无法被满足的。

Mongodb的事务是从什么时间开始的,4.0 ,对4.0 到底MONGODB 怎么就支持事务了,这种事务对处理数据和业务有什么帮助。

实际上事务中的原子性,完整性,可持久性,一致性, ACID 在MONGODB4.0 是存在的,这里MONGODB 的事务完成,提到了复制集合,并且是标注粗体的。

c6528dbb87c88150bd8b4106f4c4e9e8.png

多文档操作的事务是跨 “多个操作”,文档, collection, 数据库,这是MONGODB 在4.0后的支持事务提出的概念和可支持的对象。

传统数据库本身我们对事务如果细致的拆分,也是针对,多个操作,多行,多个表,甚至是多个数据库之间(部分RDMBA 也不存在多数据库之间)

进行 ACID 的操作。

这样的意思我可以理解为,MONGODB 引入了 “REDO”, "UNDO", rollback, 在MONGODB 事务内的操作要么全部成功,要么全部失败, 一切都在commit 的时刻后,事务所做的操作才能被展现,也就是说 MONGODB 也支持MVCC 多版本控制了。

往深入去考虑,如果使用MOGNODB的事务操作,也会有大事务,大事务会带来更多的写入成本,所以这里有一个点,我们会用MONGODB 来做大事务吗?MONGODB 文档中通过IMPORTANT 方式注明了

d6b047ebdb8f720c2a9ab588d23412aa.png

其中指明了,事务操作会引起性能方面的消耗(greater performance),并且不能因为有了事务,我们就把mongodb 当传统数据库使用,即使是传统数据库,大事务等等也是我们在使用中避免甚至对有些RDBMS是禁止的。

那我们看看MOGNODB 的事务是怎么操作的,次此操作通过mongo shell完成,如需操作请下载mongoshell 通过 mongosh 完成

1   打开session

session = db.getMongo().startSession( { readPreference: { mode: "primary" } } );
2  将需要操作的collection 进行变量绑定
testCollection = session.getDatabase("test").test;
test1Collection = session.getDatabase("test").test1;
3  开始事务标注指定MVCC的模式写模式
session.startTransaction( { readConcern: { level: "snapshot" }, writeConcern: { w: "majority" } } );
操作封装,将需要一次执行的事务封装
try {
   testCollection.updateOne( { author: 'Mike' }, { $set: { author: "Tim" } } );
   test1Collection.insertOne( { employee: 3, status: { new: "Inactive", old: "Active" } } );
} catch (error) {
   
   session.abortTransaction();
   throw error;
}

5  提交事务

session.commitTransaction();

关闭session

session.endSession();

执行结果

产生session  ,执行后给session 分配唯一的ID

repl [direct: primary] test> session = db.getMongo().startSession( { readPreference: { mode: "primary" } } );
{ id: UUID("c47251d7-b3eb-4f37-8177-19abcbb8cdb3") }

赋值变量,声明要操作的的collections

repl [direct: primary] test> testCollection = session.getDatabase("test").test;
test.test
repl [direct: primary] test> test1Collection = session.getDatabase("test").test1;
test.test1


repl [direct: primary] test> session.startTransaction( { readConcern: { level: "snapshot" }, writeConcern: { w: "majority" } } );

repl [direct: primary] test> try {
...    testCollection.updateOne( { author: 'Mike' }, { $set: { author: "Tim" } } );
...    test1Collection.insertOne( { employee: 3, status: { new: "Inactive", old: "Active" } } );
... } catch (error) {
...    
...    session.abortTransaction();
...    throw error;
... }

对事务中插入的document 产生  objectId

{
  acknowledged: true,
  insertedId: ObjectId("61b4369ce659f7fa4d869d4e")
}
提交事务后告知事务成功运行,以及事务运行的时间戳
repl [direct: primary] test> session.commitTransaction();
{
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1639200412, i: 2 }),
    signature: {
      hash: Binary(Buffer.from("a56741588989c0aeafa7506ac4da8ff4471d6d89", "hex"), 0),
      keyId: Long("7040270890788978692")
    }
  },
  operationTime: Timestamp({ t: 1639200412, i: 1 })

b8856296763aa6c1c10296002fc8615a.png

mongodb 操作事务的方式支持 java , python C# 等等具体的版本和语言在下图

4df2a5bf74b46e6511647a1d10399f14.png

本期先到这里,下一期的说说 MONGODB 的事务的参数和注意事项

7e3c7060ebe24fa1f8225b5cf5985d31.png

### Swin Transformer 论文精读:Hierarchical Vision Transformer Using Shifted Windows Swin Transformer 是一种基于视觉的分层 Transformer 模型,其核心创新在于通过 **Shifted Window-based Self-Attention** 实现了线性计算复杂度,同时能够生成多尺度特征表示。这种方法在图像分类、目标检测和语义分割等任务中取得了显著的性能提升 [^2]。 #### 核心架构概述 Swin Transformer 的整体结构分为多个阶段(Stage),每个阶段包含多个 Swin Transformer Block。这些块使用 **窗口化自注意力机制** 和 **移位窗口策略** 来实现高效计算并捕捉长距离依赖关系。 - **分层特征提取** 类似于传统卷积神经网络(如 ResNet),Swin Transformer 采用分层设计来逐步降低空间分辨率并增加通道维度。这种设计允许模型从局部到全局地构建特征表示。 - **窗口划分与移位窗口机制** 在每个 Swin Transformer Block 中,输入特征图被划分为不重叠的窗口,并在这些窗口内执行自注意力计算。为了增强跨窗口的信息交互,在下一个 Block 中对窗口进行移位操作(Shifted Windows)。这种方式既减少了计算量,又保持了模型对全局信息的感知能力 [^1]。 ```python # 窗口划分伪代码示例 def window_partition(x, window_size): B, H, W, C = x.shape # 将图像划分为多个窗口 x = tf.reshape(x, shape=[B, H // window_size, window_size, W // window_size, window_size, C]) windows = tf.transpose(x, perm=[0, 1, 3, 2, 4, 5]) return tf.reshape(windows, shape=[-1, window_size, window_size, C]) # 移位窗口伪代码 def shifted_window_attention(x, window_size, shift_size): B, H, W, C = x.shape # 对特征图进行滚动操作以实现窗口移位 x = tf.roll(x, shift=(-shift_size, -shift_size), axis=(1, 2)) return window_partition(x, window_size) ``` #### 自注意力机制优化 传统的 Vision TransformerViT)在整个图像上应用自注意力机制,导致计算复杂度为 $O(n^2)$,其中 $n$ 是图像块的数量。而 Swin Transformer 通过将注意力限制在局部窗口内,将复杂度降低到 $O(n)$,使其适用于高分辨率图像处理 [^4]。 此外,移位窗口机制确保了相邻窗口之间的信息流动,从而避免了局部注意力带来的信息隔离问题。这种设计使得 Swin Transformer 能够在保持计算效率的同时实现全局建模能力。 #### 实验结果与性能优势 Swin Transformer 在多个视觉任务中表现出色: - **ImageNet 分类任务**:Swin-Tiny、Swin-Small、Swin-Base 和 Swin-Large 四种变体均在 ImageNet-1K 上实现了优于其他 Transformer 主干网络的 Top-1 准确率。 - **COCO 目标检测**:在 COCO 数据集上,Swin Transformer 在 Faster R-CNN 框架下达到了 SOTA 性能,mAP 超过之前的最佳方法。 - **ADE20K 语义分割**:在 ADE20K 数据集上,Swin Transformer 作为编码器也取得了领先的 mIoU 指标 [^2]。 #### 消融实验分析 论文还进行了详细的消融研究,验证了以下几个关键组件的有效性: - **窗口大小的影响**:较大的窗口有助于捕捉更广泛的上下文,但会增加计算开销。 - **移位窗口的重要性**:实验证明,移位机制可以显著提升模型性能,尤其是在长距离依赖任务中。 - **不同层级的设计**:通过对比不同层级深度和通道配置,论文展示了如何平衡精度与效率 [^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值