首页
学习
活动
专区
圈层
工具
发布

mysql两阶段提交

1.什么是两阶段提交?两阶段提交是一种为了始终保持两个独立逻辑体一致的执行方式。...如果要完成提交操作在执行层面被分成了两个部分(prepare->commit),prepare阶段可以理解为询问所有参与者是否已经准备好,commit阶段确认完所有参与者准备完成那么具体执行相关操作。...2.为什么要引入两阶段提交? 通过两阶段提交保证了当一个事物会涉及多方参与时状态的一致性。...3.mysql的redo的2PC实现逻辑mysql客户端显示输入"commit"时候或者隐式提交都会触发的2PC过程。...set age=18 where id=1执行流程如下:图片innodb在写redolog日志的时候,会先写log buffer,执行阶段就会写,提交阶段就写磁盘(先prepare,后commit阶段)

1.5K71

MySQL架构(三)mysql的两阶段提交

Mysql 的两阶段提交 在 MySQL架构(二)SQL 更新语句是如何执行的?...中说到了 redo log 和 binlog 日志文件,在事务执行过程中,会分两个阶段写入这两份日志文件中,这也是为了保证两份日志之间的一致性,即维护 mysql 的数据一致性。...试想,如果不采用两阶段提交,会发生哪些情况? 由于 redo log 和 binlog 是两个独立的逻辑,不采用两阶段提交,有两种情况。...两阶段过程异常崩溃处理 如果在两阶段提交的方式下,在 binlog 日志写完,事务在没有 commit 前,即 redo log 日志还没记录 commit 前,mysql 进程发生异常崩溃,MySQL...首先,我们看一下完整的两阶段提交流程,分为准备阶段和提交阶段。 在准备阶段,MySQL 先将数据修改写入 redo log 日志,并将其标记为 prepare 状态,即事务还处于未提交状态。

1.1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySql-两阶段加锁协议 原

    MySql-两阶段加锁协议 前言 此篇博客主要是讲述MySql(仅限innodb)的两阶段加锁(2PL)协议,而非两阶段提交(2PC)协议,区别如下: 2PL,两阶段加锁协议:主要用于单机事务中的一致性与隔离性...2PC,两阶段提交协议:主要用于分布式事务。 MySql本身针对性能,还有一个MVCC(多版本控制)控制,本文不考虑此种技术,仅仅考虑MySql本身的加锁协议。...两阶段加锁对性能的影响 上面很好的解释了两阶段加锁,现在我们分析下其对性能的影响。...由于update在执行过程中对符合谓词条件的记录加的是和select for update一致的排它锁 (具体的锁类型较为复杂,不在这里描述),所以两者效果一样。...总结 MySql采用两阶段加锁协议实现隔离性和一致性,我们只有深入的去理解这种协议,才能更好的对我们的SQL进行优化,增加系统的吞吐量。

    2.4K40

    MySQL 为什么需要两阶段提交?

    什么是两阶段提交 1.1 binlog 与 redolog 1.2 两阶段提交 2. 为什么需要两阶段提交 3. 小结 为什么要两阶段提交?一阶段提交不行吗?...小伙伴们知道,MySQL 中的事务是两阶段提交,我们见到的很多分布式事务也都是两阶段提交的,例如 Seata,那么为什么要两阶段提交呢?一次直接提交了不行吗?今天我们来聊聊这个话题。...什么是两阶段提交 1.1 binlog 与 redolog binlog binlog 我们中文一般称作归档日志,如果大家看过松哥之前发的 MySQL 主从搭建,应该对这个日志有印象,当我们搭建 MySQL...1.2 两阶段提交 在 MySQL 中,两阶段提交的主角就是 binlog 和 redolog,我们来看一个两阶段提交的流程图: 从上图中可以看出,在最后提交事务的时候,有 3 个步骤: 写入 redo...由此可见,两阶段提交能够确保数据的一致性。 3. 小结 好啦,今天和小伙伴们简单聊了一下 MySQL 中的两阶段提交,有问题欢迎留言讨论。

    2.4K40

    Mysql-事务执行过程(两阶段提交)

    如果不使用"两阶段提交",那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致:一、先写 redolog 后写 binlog 会丢失数据 1、先写 redolog 后写 binlog。...两阶段提交:1、将新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于"prepare状态"。 然后告知执行器执行完成了,随时可以提交事务。...引擎把刚刚写入的 redo log 改成"提交(commit)状态",更新完成https://blog.csdn.net/weixin_43189971/article/details/126437659两阶段提交如何保证数据一致性...由此可见,两阶段提交能够确保数据的一致性。...redo_log 采用两阶段提交的方式: redo_log(prepare):记录新数据,更新redo_log状态为预提交状态。

    2.1K11

    关于mysql锁的两个例子

    版本:mysql5.5.52 存储引擎:InnoDB 隔离级别:READ-COMMITTED 示例一: 事务1:左图 事务2:右图 1、 事务2中属于快照读,基于多版本的并发控制协议——MVCC...快照读是mysql InnoDB存储引擎下,隔离级别为READ COMMITTED和REPEATABLE READ时,select语句默认的读取模式。...2、 事务1属于当前读,加排它锁,事务2的读取操作也是需要排他锁的,因此读取被阻塞,导致超时,直到事务1提交后,事务2才能读取: 3、 事务1属于当前读,加排它锁,但由于隔离级别为READ-COMMITTED...4、 对于事务1开启后在事务2中插入的记录,由于没有加排它锁,可以直接删除: 开启前已存在的记录,在事务1中加了排它锁,需等待事务1提交才能在事务2中删除: 示例二: 有一个后台的定时任务,定时向第三方发出状态改变请求...同时等待status表的锁被释放,但是此时sendChange的一系列操作尚未提交数据库,status的相关记录表仍被事务1持有,两个事务同时持有对方的资源同时在等待对方释放相关的锁,这就产生了死锁现象

    1.4K80

    三言两语记录mysql for update锁

    理解:这次查询的数据我要用于更新操作,所以麻烦Mysql帮我加锁,其他进程在我更新完成之前不能发起for update请求(可以发起普通select请求, 用于前端展示) 用途:防止高并发情况下,比如用户连续快速点击两次购买...,导致商品数量超卖 为负数等情况 必要条件 mysql innodb引擎 在事务中启用for update(直到commit 或者rollback 此次更新操作结束 释放锁) mysql暂无for update...nowait 需要封装,增加控制超时时间的逻辑,这样子伪nowait select命中索引或者主键,则为行锁,没有命中则为表锁(需要注意 避免影响业务) 测试步骤 1.一个连接A 发起事务,执行select...update; 2.另一个连接B 发起普通select请求,正常返回结果 3.连接B 发起select for update请求,由于第一个步骤的事务还没有结束,所以不能获取,会一直堵塞,直到超时 或者锁被释放后返回

    2K10

    MySQL日志系统redo log(两阶段提交)和binlog

    你可能注意到了,最后三步看上去有点“绕”,将 redo log 的写入拆成了两个步骤:prepare 和 commit,这就是"两阶段提交"。...Binlog有两种模式,statement 格式的话是记sql语句, row格式会记录行的内容,记两条,更新前和更新后都有。 四、两阶段提交 为什么必须有“两阶段提交”呢?...好了,说完了数据恢复过程,我们回来说说,为什么日志需要“两阶段提交”。这里不妨用反证法来进行解释。...简单说,redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。...这个参数我也建议你设置成 1,这样可以保证 MySQL 异常重启之后 binlog 不丢失。 我还跟你介绍了与 MySQL 日志系统密切相关的“两阶段提交”。

    1.2K20

    【说站】mysql锁的两种不同状态

    mysql锁的两种不同状态 状态锁说明 1、包括意向共享锁和意向排他锁,它们被区分为状态锁的核心逻辑。 2、这两种锁都是描述是否可以在某个表上添加表锁的状态。...当一项事务试图在整个表中加锁(共享锁或排锁)时,首先需要获得相应类型的意向锁(意向共享锁或意向共享锁) 意向共享锁 当一个事务试图在整个表格中添加共享锁时,首先需要获得该表格的意向共享锁。...意向排他锁 在一项事务试图将整个表格加排锁定之前,首先需要得到该表格的意向锁定。 状态锁的作用 innodb加锁的方法是基于索引,锁定粒度是行锁。...意向锁的存在是为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。 以上就是mysql锁的两种不同状态,希望对大家有所帮助。

    76020

    关于MySQL锁的两个知识点

    关于MySQL中锁的两个知识点 1 MySQL快照读和当前读 当我们对数据库中的表进行select、update、delete以及insert的时候,innodb存储引擎会根据操作类型的不同来给这些操作添加具体的锁...在MySQL中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。快照读,读取的是记录的可见版本 (有可能是历史版本),不用加锁。...其中,除了第一条语句明确指出了lock in share mode之外,也就是对读取记录加S锁 (共享锁)外,其他的操作,都加的是X锁 (排它锁)。...2 关于死锁 死锁是指两个或者两个以上的事务在执行的过程中,因争夺资源而造成的一种互相等待的现象。若无外力作用,这两个事务将保持等待状态,无法推进下去。很明显,这是我们不想看到的。...id=3的记录的锁,我们发现了两个变化: 第一、会话B上输出了死锁的提示信息,如下; mysql> select * from t where id=3 for update; ERROR 1213 (

    81310

    【MySQL】MySQL锁(四)其它锁概念

    当两个事务同时操作时,互相持有对方所需要的锁时,就会产生死锁。比如下面这个由于互相需要更新对方的数据而导致的死锁。...1手中 于是,事务2想要完成必须要获得事务1的锁,而事务1想要完成也必须得到事务2的锁,这样两个事务就陷入死循环了,谁都没办法拿到对方的锁 这就是死锁!...也就不会有间隙锁的死锁问题 最后,还有两个死锁相关的配置可以了解下。...当不使用 innodb_deadlock_detect 时,这个超时时间就非常重要了,否则两个事务会一直僵持下去。 乐观锁与悲观锁 最后的概念,相信大家也经常听到过这两个名词。...总结 最早两个月前看书时看到锁就是一脸懵逼,接着过了两个月又开始找相关的视频,渐渐有了感觉,最后在写这几篇文章的时候又查询资料,现在才敢说是略微掌握了锁这块的知识。

    98910

    【MySQL】MySQL锁(二)表锁与行锁测试

    可以看到返回的信息中有两行数据,第一条数据中的 lock_mode 字段显示的是就是一个 IS ,lock_type 字段显示的是 TABLE ,也就是表级别的一个 意向共享锁 。...第二条数据中,lock_type 的 RECORD 表示的这是一条记录锁,也就是 行锁 ,后面的 lock_mode 中有两个内容,S 表示共享锁,REC_NOT_GAP 表示是没有 GAP 锁,这个东西我们放到...-- 排它锁及意向排它锁 mysql> begin; mysql> UPDATE test_user2 SET name = 'fff' WHERE id = 1212121; -- 锁情况 mysql...这个时候给整个表加任何锁都不行了。 行锁更新两条不同的数据 行锁的优势是什么?当然就是可以同步地更新不同的行记录,这一点也是比 MyISAM 之类的表锁引擎强大的地方。...> update test_user2 set name = 'fff' where id = 1212121; -- 阻塞 在两个事务中更新同一条数据,就会遇到锁的情况,这是因为什么呢?

    2.4K10

    【MySQL】MySQL锁(三)元数据锁与间隙锁

    MySQL锁(三)元数据锁与间隙锁 在上篇文章中,我们就提到过 元数据锁 和 间隙锁 这两个名词,不知道有没有吊起大家的胃口。这俩货又是干嘛的呢?别急,我们一个一个来看。...-- 事务1 mysql> select * from test_user3; -- 修改表结构 alter table 阻塞 mysql> alter table test_user3 add column...假设现在有两条记录,id 分别为 5 和 10 ,那么在 5-10 中间就是我们的数据间隙,这里就是 间隙锁 发挥的地方。...临键锁(Next-key Lock),是一个新的概念,但它其实是 记录锁 和 间隙锁 的结合,也是 MySQL 默认的 行锁 。什么意思呢?...因此,间隙 和 记录 这两种锁其实都是 临键锁 的退化版本,或者说是简易版本。注意,这个退化仅限于主键是由一个列组成的,如果是多个列组成的,则不会发生退化。

    1.2K10

    【面试题精讲】mysql中的两阶段提交

    什么是两阶段提交? 两阶段提交(Two-phase commit,2PC)是一种分布式系统中,确保事务在参与者间的一致性的协议。两阶段提交旨在解决在分布式系统中,多个节点协同完成任务的问题。 2....两阶段提交就是为了解决这个问题而诞生的。 3. 两阶段提交的实现原理? 两阶段提交主要包含两个阶段:准备阶段和提交阶段。...两阶段提交的使用示例 以下是一个使用 Java 模拟的两阶段提交的例子: public class TwoPhaseCommit {     // 模拟两阶段提交     public static void...两阶段提交的优点 两阶段提交协议,保证了操作的原子性,所有节点要么都提交,要么都回滚,从而实现了分布式系统中数据的一致性。 6....两阶段提交的缺点 两阶段提交虽然能够保证数据一致性,但是也存在如下两个问题: 同步阻塞问题:在整个两阶段提交过程中,所有参与者都是阻塞的。

    75720

    MySQL 锁

    意向锁是表级别的锁,主要作用是通知其他会话某个表上是否已经存在了更细粒度的锁(如行级锁或页级锁)。有两种类型的意向锁: 意向共享锁 (IS) 表示事务打算在表中的各个行上设置共享锁。...比如会话 1 获取了某一行的排他锁,并未提交: SELECT * FROM goods WHERE id=1 FOR UPDATE; 此时会话在 goods 表存在两把锁:goods 表上的意向排它锁与...MySQL BDB 引擎支持页级锁,不过该引擎已在 MySQL 5.1 被弃用,所以对于页级锁,知道即可,不用过多了解。...举个例子(表和数据依然是上面例子 lock_example 表),事务 A 先执行,在 age 10 与 24 两条记录中插入一行,还未提交: INSERT INTO lock_example VALUES...InnoDB Locking 深入剖析 MySQL 自增锁 MySQL 有哪些锁?

    1.8K30

    MySQL锁

    锁概述   MySQL的锁机制,就是数据库为了保证数据的一致性而设计的面对并发场景的一种规则。   ...间隙锁(gap lock)   MySQL默认隔离级别是可重复读,这个隔离级别为了避免幻读现象,引入了这个间隙锁,对索引项之间的间隙上锁。   ...会话2的where条件也必须是索引,才能锁住这一行,否则会试图去锁整张表的数据,而整张表的数据已经有一行被会话1锁了,所以会话2锁不上。 为什么我要锁一行,MySQL给我锁全表?   ...MySQL的服务层不管理事务,事务是由下层的存储引擎实现的(表锁是由MySQL的服务层实现的),所以在同一个事务中,使用多种存储引擎的表是有风险的。   ...InnoDB采用的是两阶段锁定协议。

    2.5K10

    Mysql锁

    表锁 表锁分为写锁,读锁,二者读读不阻塞,读写阻塞,写写阻塞 2....行锁 行锁分为共享锁,排他锁,即读锁和写锁 多粒度锁机制自动实现表、行锁共存,InnoDB内部有意向表锁 意向共享锁(IS):事务在给一个数据行加共享锁前必须先取得该表的IS锁。...查询和插入可以并发,若表中没有被删除的行,可在一个进程读表的同时,另一个进程从表尾插入数据,InnoDB不行 mysql中同时加锁,写锁优先于读锁 4....MVCC 锁的应用最终导致不同事务的隔离级别、而MVCC多版本并发控制,通过增加版本的形式实现两种隔离级别(不使用到锁),MVCC读写不阻塞,是行级锁的升级 隔离分为语句级Readcommitted隔离级别和事务级...,事务A数据根据事务B而改变 事务级: 事务A读取数据生成版本号1 事务B修改数据生成新版本2 事务A再读取数据还是用版本号1 避免了不可重复读,出现了幻读 MySQL的 Repeatableread隔离级别加上

    1.6K20

    MySQL 锁

    # MySQL 锁 概述 全局锁 介绍 语法 特点 表级锁 介绍 表锁 元数据锁 意向锁 行级锁 介绍 行锁 间隙锁&临键锁 # 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。...此时就可以借助于MySQL的全局锁来解决。 B....对于表级锁,主要分为以下三类: 表锁 元数据锁(meta data lock,MDL) 意向锁 # 表锁 对于表锁,分为两类: 表共享读锁(read lock) 表独占写锁(write lock) 语法...# 行锁 介绍 InnoDB实现了以下两种类型的行锁: 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。...两种行锁的兼容情况如下: 常见的SQL语句,在执行时,所加的行锁如下: SQL 行锁类型 说明 INSERT ... 排他锁 自动加锁 UPDATE ... 排他锁 自动加锁 DELETE ...

    2K10

    Mysql锁

    MySQL表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。...死锁 指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。...在MySQL中,行级锁并不是直接锁记录,而是锁索引。当两个事务同时执行,一个锁住了主键索引,在等待其他相关索引。另一个锁定了非主键索引,在等待主键索引。这样就会发生死锁。...当出现死锁以后,有两种策略: 一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数innodb_lock_wait_timeout来设置。...对于键值在条件范围内但并不存在的记录,称为间隙,InnoDB也会为这些间隙加锁,即间隙锁。 比如数据库中只有1,4两条数据,如果查找不存在的3,则会导致(1,4)区间锁定。

    2.2K20
    领券