`

【MySQL】MySQL默认事务隔离级别 —— Repeatable Read

阅读更多

MySQL 的默认事务隔离级别是 Repeatable Read(可重复读)。

Oracle 的默认事务隔离级别是 Read Committed(读已提交)。

这是一个比较“怪”的现象。毕竟这两个事务隔离级别是差异是比较大的,而这两个数据库都是通用型的产品。

真实原因是MySQL为了规避一个数据复制场景中的缺陷,而选择 Repeatable Read 作为默认隔离级别。

 

基于 Statement 的 binlog

binary log 的主要用途

MySQL的 binary log 记录了数据库的“事件”。这些“事件”描述了数据库的改动,包括 表的创建、数据修改等。

 

binary log 主要用于:

  • 主从复制。主库 master 会将其 binary log 中的数据改动记录(“事件”)发送给 从库 slave。从库执行这些“事件”使数据与主库保持一致。
  • 数据恢复

 

binary log 的三种模式

binary log 有三种模式:

  • Statement:记录的是可能改变数据的SQL语句
  • Row:记录的是每行数据的变更
  • 混合模式:
    默认使用 Statement 格式的记录;
    当遇到可能引起 “基于Statement的数据复制问题” 时自动转换为 Row 模式。

 

基于Statement的数据复制问题


 

上述两个事务的隔离级别都是 Read-Committed。

真实的执行顺序是 先删后插。而 binlog 中记录的 Statement 顺序为 先插后删

当基于这份 Statement 格式的 binlog 进行主从复制或恢复数据时,得到的最终数据与实际情况不符。

 

两种解决方法:

  • 选用 Row 模式 的 binlog
    针对实际数据行的记录当然可以准确反映改动历史
  • 选用 Repeatable-Read 事务隔离级别
    “可重复读”隔离级别下,delete、insert 等语句会对数据加 间隙锁。上述Session2中的insert语句将被阻塞,直到session1 commit;

因为早期MySQL只支持 Statement 格式的 binlog,所以只能采用 Repeatable-Read 隔离级别来规避数据不一致的风险。

从 5.7.7 开始,MySQL的默认 binlog 格式已经是 ROW

 

选哪种事务隔离级别?

大多数项目中可以选 Read-Committed(读已提交),既降低死锁几率,又能提升并发性能。同时选用 Row 模式的binlog。

 

当然,这类 “最终一致性”的事务解决方案可能无法满足某些特殊项目的需求,需要采用 Serializable (串行)的隔离级别。

 

  • 大小: 17.9 KB
分享到:
评论

相关推荐

    MySQL数据库:事务隔离级别.pptx

    数据库编程 事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置...MySQL默认为REPEATABLE READ隔离级。 事务隔离级别 序列化 如果隔离级为序列化,用

    MySQL数据库事务隔离级别详解

    数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为 Read uncommitted:允许脏读。 Read committed: 防止脏读,最...事务级别 脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed

    浅析MYSQL REPEATABLE-READ隔离级别

    REPEATABLE-READ 即可重复读,set autocommit= 0或者START TRANSACTION状态下select表的内容不会改变。这种隔离级别可能导致读到的东西是已经修改过的。 比如: 回话一中读取一个字段一行a=1 在回话二里这个字段该行...

    Jonny023#Study#事务隔离级别1

    事务:保证数据一致性,要么执行,要么不执行,mysql默认事务隔离级别:REPEATABLE-READ开启事务三个问题不可重复读:指在一个事务中,对同一数据进行

    MySQL 四种事务隔离级别详解及对比

    按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ)。MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别。你可以在命令行用–transaction-isolation选项,或在选项文件里,为所有连接设置...

    MySQL数据库事务隔离级别

    在最后加上#可选参数有:READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ,SERIALIZABLE.2[mysqld]3transaction-isolation=REPEATABLE-READ这里全局默认是REPEATABLE-READ,其实MySQL本来默认也是这个级别2....

    Mysql事务隔离级别原理实例解析

    再加上很多书都说可重复读解决了幻读问题,比如《mysql技术内幕–innodb存储引擎》等,不一一列举了,因此网上关于事务隔离级别的文章大多是有问题的,所以再开一文说明! 本文所讲大部分内容,皆有官网作为佐证,...

    解读MySQL事务的隔离级别和日志登记模式选择技巧

    MySQL的四种事务隔离级别:Read-uncommitted、Read-committed、Repeatable-read、Seriailizable,相信大家都清楚各自异同,不清楚的朋友可以查看另外一篇技术文章:MySQL_InnoDB之事务与锁详解。但是对于第二类、第...

    MySQL数据库事务隔离级别介绍(Transaction Isolation Level)

    数据库隔离级别有四种,应用《高性能mysql》一书中的说明: ...这里全局默认是REPEATABLE-READ,其实MySQL本来默认也是这个级别 2.对当前session修改,在登录mysql客户端后,执行命令: 要记住mysql有一个autoc

    详细讲解数据库隔离的基本慨念.doc

    数据库事务隔离分为4个隔离级别。 MySQL的默认隔离级别就是Repeatable read。 由低到高: Read Uncommitted(读未提交) Read committed(读提交) Repeatable read(可重复读) Serializable(序列化 )。

    MySQL事务的四个特征及其隔离级别

    目录1、事务概念2、事务使用3、事务的四大特征(ACID)3.1 原子性(atomicity)3.2 一致性(Consistency)3.3 隔离性(Isolation)3.3.1 read uncommitted(读未提交的);3.3.2 read committed(读已提交的);3.3.3 ...

    mysql 详解隔离级别操作过程(cmd)

    Repeatable Read –可重复读-(在当前事务内,重复读取第一次读取过的数据就叫可重复读。) 3、修改A端的隔离级别为readuncommitted –读未提交。意思是可以读取别人没有提交的数据。 set transactionisolation ...

    数据库事务

    MySQL数据库为我们提供的四种隔离级别: ...  Mysql 的默认事务级别是: Repeatable read  Oracle的默认事务级别是:Read committed  查看数据库的事务级别命令是:select @@tx_isolation;  

    java-数据库系统原理.docx

    并发访问问题 事务隔离级别 丢失修改 MySQL 所有事务隔离级别在数据库层面上均可避免 脏读 READ-COMMITTED 事务隔离级别以上可避免 不可重复读 REPEATABLE-READ 事务隔离级别以上可避免 幻读 SERIALIZABLE 事务隔离...

    transaction_isolation:以与数据库无关的方式在ActiveRecord中设置事务隔离级别

    支持所有ANSI SQL隔离级别::serializable,:repeatable_read,:read_committed,:read_uncommitted。 另请参阅 gem,以获取有关死锁和序列化错误的自动重试事务。例子 ActiveRecord::Base.isolation_level( :...

    mysql面试题,MySQL是一种关系型数据库管理系统,由Oracle公司开发

    5. MySQL的事务有哪些级别? 答:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)、串行izable(SERIALIZABLE) 6. MySQL的存储引擎有哪些? 答:InnoDB、MyISAM、Archive等 7. ...

    mysql数据库my.cnf配置文件

    # MySQL支持4种事务隔离级别,他们分别是: # READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. # 如没有指定,MySQL默认采用的是REPEATABLE-READ,ORACLE默认的是READ-COMMITTED log_bin = mysql...

Global site tag (gtag.js) - Google Analytics