首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏DOTNET

    MongoDB模拟文档事务操作

    Mongodb不支持文档原子性操作,因此依据两阶段提交协议(Two Phase Commits protocol)来模拟事务。 以两个银行账户之间的转账行为为例,来说明如何实现文档间的事务操作。 为实现文档间的事务操作,定义一个事务文档TransactionDocument,储存在事务集合TransactionCollection中 public class TransactionDocument22步,第1步执行成功的前提下,将事务文档状态由“initial”更改为“pending”。 第3步,第2步执行成功的前提下,对两个账户应用事务,执行转账。 回滚的步骤为: 第1步,将事务文档状态由“pending”更改为“canceling”。 第2步,账户余额还原为操作之前的状态,删除两个账户的待处理事务链表中的事务文档_id. TransactionDocumentP t2 = RetrieveTransaction(); //2事务文档状态由“initial”更改为“pending”,超时跳出

    1.5K90发布于 2018-03-08
  • 来自专栏多线程

    Spring事务事务传播机制(2

    Spring事务管理提供了灵活的方式来处理事务,包括事务的创建、提交、回滚以及事务的传播行为。 书接上回:Spring事务事务传播机制(1) 2、Spring 中设置事务隔离级别 Spring 中事务隔离级别可以通过 @Transactional 中的 isolation 属性进行设置,具体操作如下图所示 该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读 2、READ COMMITTED: 读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据因此它不会有脏读问题 Spring 事务传播机制定义了多个包含了事务的方法,相互调用时,事务是如何在这些方法间进行传递的。 2、为什么需要事务传播机制? 嵌套事务和加入事务有什么区别 整个事务如果全部执行成功,二者的结果是⼀样的。 如果事务执行到一半失败了,那么加入事务整个事务会全部回滚;而嵌套事务会局部回滚,不会影响上一个方法中执行的结果

    59620编辑于 2023-10-16
  • 来自专栏颇忒脱的技术博客

    事务 - 2PC

    2PC github 在上一篇文章中我们介绍了本地事务,随着软件复杂度的上升,我们会需要一种可以在多个数据库之间完成事务(分布式事务)的方法,而这个方法也必须能够保证ACID。 于是就出现了2PC - Two phase commit protocol。事实上2PC不仅仅适用于多数据库事务场景下使用,也适用于所有支持2PC的参与方(Participants)。 缺点 根据上面的算法介绍可以看出2PC是一个阻塞协议: 如果两个事务针对同一个数据,那么后面的要等待前面完成,这是由于Cohort采用的是本地事务所决定的 Cohort在commit request phase 之后会阻塞,直到进入Coordinator告之Cohort进入commit phase 对于ACID的保证 2PC所保证的ACID和本地事务所提到的ACID不太一样——事实上对于所有分布式事务来说都不太一样 : A,正常情况下保证 C,在某个时间点,会出现A库和B库的数据违反一致性要求的情况 I,在某个时间点,A事务能够读到B事务部分提交的结果 D,和本地事务一样,只要commit则数据被持久 XA XA是一个针对分布式事务

    89230发布于 2018-10-19
  • 来自专栏jeremy的技术点滴

    mongodb4.0文档事务尝鲜

    mongodb4.0也出来一段时间了,这个版本最为大众期待的特性就是支持了文档事务(multi-document transaction),本文记录一下尝鲜该特性的过程。 mongodb文档事务 In MongoDB, an operation on a single document is atomic. 而因为在mongodb里还可以采用嵌入式文档和数组来描述文档中的数据结构关系,所以这种单文档原子性基本消除了许多实际对文档事务的需求。 另外4.0版本仅支持复制集中的文档事务,分片集群中的文档事务将计划在4.2版本中实现。 虽然有以上这些限制,还再怎么说也多了文档事务能力,比以前还是进步了的。 go语言支持 mongodb社区版go语言驱动目前还没有支持mongodb4.0的文档事务特性,看其开发计划,短期是不太可能支持了。

    1.5K30发布于 2019-03-13
  • 来自专栏kafka

    事务 - 2PC提交

    场景:你的业务一次操作需要同时更新多个资源,比如:两个不同的MySQL库(你现在问的场景)数据库+消息队列数据库+缓存等如果不用分布式事务,就可能出现:A库更新成功,B库更新失败→数据不一致2PC要解决的就是 二、2PC会带来哪些问题?1.性能开销大一次事务要走两个阶段,网络往返、日志写入。prepare阶段会长时间持有锁到commit完成,吞吐量下降,冲突增多。 2.锁时间长,容易造成阻塞在prepare之后到最终commit/rollback之前,相关行/页/表都被锁住。协调器慢、网络抖动、参与者负载高→这些锁就会被持有更久,其他事务被阻塞,甚至导致雪崩。 6.运维与排错困难出现「悬挂事务」「prepare卡住」「XA事务残留」等问题时,排查和处理都比较重。需要看协调器日志、各库的XA状态,甚至手工XARECOVER/XACOMMIT/ROLLBACK。 所以很多系统宁可用「本地事务+Outbox+CDC/消息」做最终一致性,也会慎用XA级别的2PC。

    10510编辑于 2026-01-13
  • 来自专栏Java实战博客

    2 Redis 事务 & 乐观锁

    Redis事务没有事务隔离的级别。 但是Redis事务的本质是:将一组操作放入队列(先进先出)中,批量执行。 关系型数据库的事务是:将事务操作(DML)语句写入日志。 事务相关的命令 Multi:开启事务 Exec:执行事务 Discard:终止事务 image.png 说明:Exec之前的事务操作可以被discard终止 但是一旦exec 本次事务就会执行! Redis 如何实现事务呢? 开启一个队列 让命令进入队列 执行事务 # 1 开启事务 multi # 2 输入命令 set k1 v1 set k2 v2 get k2 set k2 v3 get k2 # 3 执行/放弃事务 watch 需要锁Key名 # 线程1 操作:开启事务,并设置money为80 但不执行事务 multi set money 80 或者 decrby money 20 # 线程2 操作:读取money

    57520编辑于 2022-01-19
  • 来自专栏陶士涵的菜地

    MVCC 版本并发控制实现的事务

    1.没有一个统一的实现标准,实现了非阻塞的读操作,写操作也只锁定必要的行 2.通过保存数据在某个时间点的快照实现的 3.典型的有乐观并发控制和悲观并发控制 4.innodb的mvcc是每次事务都有递增的版本号 ,通过在每行记录的后面添加两列隐藏字段,两列分别是是创建版本号和删除版本号,存储操作它事务的版本号 5.在事务中增删改查就是对两列版本号字段进行操作 insert 为新插入的每一行保存当前事务版本号到 行创建版本号字段 update 插入一行新的保存当前事务创建版本号,修改原行数据的删除版本号为本次事务的版本号 delete 修改行的删除版本号字段为本次事务的版本号 select 查询 创建版本号字段 小于等于当前事务版本的数据 确保该记录是本次之前就存在的或本次事务新插的 查询 删除版本号字段 不存在或者大于当前版本的数据 确保该记录在本次事务之前没删除 6.这样的设计就不需要加锁了

    48510发布于 2019-09-10
  • 来自专栏芋道源码1024

    MongoDB 4.0 正式发布,支持文档事务

    在 4.0 正式发布之前,我们已经报道了其相关更新信息,此次正式发布版本中我们可以看到一些特性得以保留,包括文档事务和聚合类型转换等: MongoDB 4.0 首个 RC 版发布,支持文档事务 分布式文档存储数据库 MongoDB 4.0.0 RC 2 发布 MongoDB 4.0.0-rc4 发布,分布式文档存储数据库 重大功能,MongoDB 4.0 将正式支持 ACID 事务 下边是此次更新涉及到的一些内容 : Multi-Document Transactions,文档事务 MongoDB 4.0 提供了针对副本集执行文档事务的功能。 对于文档事务,在事务提交之前,事务中的任何写操作在事务外都不可见。也就是说,文档交易是原子的。 Aggregation,聚合 MongoDB 4.0 为类型转换添加了以下新的聚合操作符: ? 接下来的版本中,MongoDB 将结束对以下平台的支持: Windows 7/2008R2 Windows 8/20012 Windows 8.1/20012R2 Ubuntu 14.04 General

    1.3K00发布于 2018-07-31
  • 来自专栏苏三说技术

    面试前看了这篇spring事务的文章,让我要了2k的工资

    它是真正执行事务功能的地方,后面我会用重点介绍。 spring基于注解事务开启的功能,先介绍到这里,下面我们一起看看springboot是如何开启事务的。 2、springboot自动开启事务 ? initApplicationException(throwableHolder.throwable); } throw ex2; } catch (Throwable ex2) { if (throwableHolder.throwable ! throw ex2; } } //如果不需要回滚事务 else { try { //继续提交事务 throw ex2; } } } } 我们重点看一下是如何判断要回滚事务的,看一下txInfo.transactionAttribute.rollbackOn方法 @

    97843发布于 2020-10-15
  • MySQL事务隔离实现原理,版本并发控制MVCC

    MVCCMVCC,全称Multi-Version Concurrency Control,即版本并发控制。 当前读、快照读、MVCC关系MVCC版本并发控制指的是维持一个数据的多个版本,使得读写操作没有冲突,快照读是MySQL为实现MVCC的一个非阻塞读功能。 从上述表格中,可以看到,当事务2对某行数据执行了快照读,数据库为该行数据生成一个Read View视图,可以看到事务1和事务3还在活跃状态,事务4在事务2快照读的前一刻提交了更新,所以,在Read View :当事务2在快照读该行记录的是,会拿着该行记录的DB_TRX_ID去跟up_limit_id,lower_limit_id和活跃事务列表进行比较,判读事务2能看到该行记录的版本是哪个。 ,所以不符合条件,判断事务4是否处理trx_list列表中,发现不再次列表中,那么符合可见性条件,所以事务4修改后提交的最新结果对事务2 的快照是可见的,因此,事务2读取到的最新数据记录是事务4所提交的版本

    58310编辑于 2024-07-03
  • 来自专栏个人技术博客

    ⑩⑧【MySQL】InnoDB架构、事务原理、MVCC版本并发控制

    2. InnoDB架构 架构: MySQL5.5版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用非常广泛。 DATAFILE '表空间文件名' ENGINE = 存储引擎名; -- 创建表时指定关联的通用表空间 CREATE TABLE 表名( 字段1 字段1类型 [COMMENT 字段1注释], 字段2 字段2类型 [COMMENT 字段2注释], 字段3 字段3类型 [COMMENT 字段3注释], ... ⚪undo log 回滚日志 - undo log: 回滚日志 ,用于记录数据被修改前的信息,作用包含两个:提供回滚 和 MVCC(版本并发控制) 。 版本并发控制 - MVCC: 全称Multi--Version Concurrency Control,版本并发控制 。

    65220编辑于 2023-11-21
  • 来自专栏CodingToDie

    MySQL 事务隔离级别和版本并发控制MVCC

    MySQL 事务隔离级别和版本并发控制MVCC MySQL 提供了两种事务型的存储引擎:InnoDB 和 NDB Cluster 。另外还有一些第三方存储引擎也支持事务 ---- 1. 数据库事务2. 事务并发可能出现的问题2.1 脏读2.2 不可重复读2.3 幻读3. 版本并发控制(MVCC)4.1 InnoDB 的MVCC5. 混合存储引擎下的事务问题6. 时间、事务 事务事务二 1 begin 2 begin 4 select name from movie where id <= 70; 此时应该查询到 2 条数据为 1. 唐探3, 2. 版本并发控制(MVCC) MySQL 大部分事务型存储引擎并不是简单的行级锁。

    1.3K10发布于 2021-03-19
  • 来自专栏浅谈电商系统的实践经验

    消息队列(2)--如何利用事务消息实现分布式事务

    1.怎么使用事务消息实现分布式事务消息队列中的“事务”,主要解决的是消息生产者和消息消费者的数据一致性问题应用场景:订单系统下订单后,需要在购物车系统清空购物车事务消息适用的场景主要是那些需要异步更新数据 方案:1.TCC 2PC 3PC Saga(强一致性,并发量不发的情况下使用,比如下订单和使用优惠券)2.可以使用本地消息表实现最终一致性(可以短时间接受不一致,前提是:异步执行的部分不依赖资源)3.使用支持事务的消息中间件 RocketMQ Kafka(本地消息表思想的一种实现,使用起来更简单)具体以方案3事务消息实现分布式消息为例:图片1.开启事务2.发送半消息3.成功后执行本地事务,创建订单4.本地事务执行成功,则提交事务 ;本地事务执行失败,则回滚事务细心的同学发现步骤4:如果本地事务执行成功,提交事务的时候,请求失败了,怎么办? RocketMQ 会自动根据事务反查的结果提交或者回滚事务消息。图片2.怎么保证消息顺序消费?

    1K30编辑于 2023-10-03
  • 来自专栏Postgresql源码分析

    Postgresql实验系列(2)批量获取事务ID

    2 改造前 (性能数据没有太大参考意义,只用于前后对比) 16C小规格测试机128并发压测,PG参数全部异步写,瓶颈来到事务ID生成 128并发压测只写120秒XidGen锁每秒的出现数量:均值在60左右 = 80589 -- 参数 fsync = off synchronous_commit = off autovacuum = off create table testbl1(c1 int, c2 3.1 改造方案一 【本地进程】拿事务ID从一次拿一个变成一次拿N个,其他不变。 关键改造点: GetNewTransactionId:预存本地N个事务ID,取的时候先取本地,再去共享的。 GetSnapshotData:要求事务ID必须严格递增,这里可能会有空洞触发assert。 3.2 改造方案二(较复杂不做测试) 拿事务ID由每个进程自己拿,变成由一个进程统一分配。

    61810编辑于 2022-11-06
  • 来自专栏快乐阿超

    r2dbc事务处理

    ——恩格斯 官方demo: https://github.com/spring-projects/spring-data-examples/blob/main/r2dbc/example/src/main /java/example/springdata/r2dbc/basics/TransactionalService.java /* * Copyright 2019-2021 the original IllegalStateException(); } else { return it; } }); } } 可以看到是支持Transactional的 当然我们可以手动回滚事务 ,配置: import io.r2dbc.spi.ConnectionFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.r2dbc.connection.R2dbcTransactionManager

    58120编辑于 2023-10-31
  • 来自专栏睿Talks

    React 源码深度解读(八):事务 - Part 2

    React 15.4.2 ,以下是本系列其它文章的传送门: React 源码深度解读(一):首次 DOM 元素渲染 - Part 1 React 源码深度解读(二):首次 DOM 元素渲染 - Part 2 源码深度解读(三):首次 DOM 元素渲染 - Part 3 React 源码深度解读(四):首次自定义组件渲染 - Part 1 React 源码深度解读(五):首次自定义组件渲染 - Part 2 React 源码深度解读(六):依赖注入 React 源码深度解读(七):事务 - Part 1 React 源码深度解读(八):事务 - Part 2 React 源码深度解读(九):单个元素更新 React

    39920编辑于 2022-06-14
  • 来自专栏关忆北.

    MySQL-MVCC版本控制及事务的隔离性

    MySQL的MVCC快照 MVCC:Multiversion concurrency control,即版本控制,在并发访问数据库时,通过对数据做版本管理,也就是为每条记录保存份历史数据供读事务访问 版本指的是数据表中同一个行数据可能会有多个版本(row),每次事务更新数据的时候,都会生成一个新的数据版本,并且把 transaction id 赋值给这个数据版本的事务 ID,记为 row trx_id A查询到的k值为1,因为事务A首先启动,创建事务id,接着是事务B,事务B的row trx_id会大于事务A,落在高水位未开始事务中,数据修改对A不可见,事务C隐式开启事务,执行完成后隐式提交,由于同样 事务B查询到的k值为3,事务B首先开启事务事务C随后开启,事务C将k=1修改为k=2,由于在修改时会使用“当前读”来查询数据的最新版本来保证数据的修改不会丢失,所以事务B在执行update语句前会查询到当前版本 k=2,更新后k=3。

    52850编辑于 2023-10-11
  • 来自专栏小四的技术文章

    分布式事务2PC

    ,也可能存在不同服务器的库里,所以就出现了分布式 事务,分布式的解决方案有多种,例如2PC,3PC,TCC等,今天主要来说一下2PC事务的思想。 2PC阶段解释 2PC指的是两阶段提交,整个事务流程分为两个阶段,分别为Prepare阶段和Commit阶段,Prepare为预提交阶段,它不会提交事务,Commit阶段才是真正的提交 事务的阶段,2PC 2PC流程 协调者向参与者发送Prepare消息 协调者向参与者发送Prepare消息,参与者执行完本地事务后返回协调者一个状态,表明自己是否能够执行,并将执行的事务保存起来,并没有提交。 思考 我们从2PC的整个流程中可以看出其实会有一些问题。 效率问题 当某个事务在执行的过程中,资源是会被锁住的,那么其他事务就会被阻塞,直到当前事务完成后 才轮到下一个事务执行,这在高并发的情况下显然不行,如果事务不耗时还好说,如果事务很耗时,那么就无法忍受了

    63710编辑于 2022-07-26
  • 来自专栏MongoDB中文社区

    Java与MongoDB 4.0文档事务新特性体验

    作者:Maxime Beugnet 译者:徐雷( Frank Xu) 01 MongoDB4.0文档事务新特性介绍 MongoDB 4.0增加了对文档ACID事务的支持。 但等等......这是否意味着MongoDB直到现在才支持事务?不,实际上MongoDB已经提供了对单个文档事务的支持。 MongoDB 4.0跨文档、多语句、集合和多数据库扩展了事务保证。 Alice希望购买2瓶啤酒,但我们不会为此使用新的MongoDB 4.0文档事务。 我们将在变更流中观察两个操作:一个创建购物车,另一个在两个不同的集群时间更新库存。 然后Alice在购物车中添加了2瓶啤酒,这次我们使用事务。变更流中的结果将监控在同一群集时间发生的2个操作。 大家还可以注意到,两个第一个集群时间是不同的,因为我们没有对两个第一个操作使用事务,并且最后两个操作共享相同的集群时间,因为我们使用了新的MongoDB 4.0文档事务特性,因此 这2个操作是原子性的

    3K20发布于 2018-12-27
  • 来自专栏全栈程序员必看

    db2事务隔离级别设置_db2存储过程

    db2锁 ⑴ 引言 在关系型数据库(BD2,Oracle,Sybase,Informix和Sql Server)最小的恢复和交易单位为一个事务事务具有ACID(原子性,一致性,隔离性,永久性)特征。 ⑵ DB2力度封锁机制 锁的对象 DB2支持对表空间、表、行和索引加锁(大型机上的数据库还可以支持对数据页加锁)来保证数据库的并发完整性。 DB2表锁的模式 表一:DB2数据库表锁的模式 下面对几种表锁的模式进一步加以阐述: IS、IX、SIX方式用于表一级并需要行锁配合,他们可以阻止其他应用程序对该表加上排它锁。 DB2行锁的模式 表二:DB2数据库行锁的模式 2.2.3 DB2锁的兼容性 表三:DB2数据库表锁的相容矩阵 表四:DB2数据库行锁的相容矩阵 下表是本篇文章的作者总结了DB2中各SQL语句产生表锁的情况 (假设缺省的隔离级别为CS): DB2锁的升级 每个锁在内存中都需要一定的内存空间,为了减少锁需要的内存开销,DB2提供了锁升级的功能。

    2K10编辑于 2022-11-04
领券