MySQL 的默认事务隔离级别是 Repeatable Read(可重复读)。
Oracle 的默认事务隔离级别是 Read Committed(读已提交)。
这是一个比较“怪”的现象。毕竟这两个事务隔离级别是差异是比较大的,而这两个数据库都是通用型的产品。
真实原因是MySQL为了规避一个数据复制场景中的缺陷,而选择 Repeatable Read 作为默认隔离级别。
基于 Statement 的 binlog
binary log 的主要用途
MySQL的 binary log 记录了数据库的“事件”。这些“事件”描述了数据库的改动,包括 表的创建、数据修改等。
binary log 主要用于:
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 (串行)的隔离级别。
相关推荐
数据库编程 事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置...MySQL默认为REPEATABLE READ隔离级。 事务隔离级别 序列化 如果隔离级为序列化,用
数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为 Read uncommitted:允许脏读。 Read committed: 防止脏读,最...事务级别 脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed
REPEATABLE-READ 即可重复读,set autocommit= 0或者START TRANSACTION状态下select表的内容不会改变。这种隔离级别可能导致读到的东西是已经修改过的。 比如: 回话一中读取一个字段一行a=1 在回话二里这个字段该行...
事务:保证数据一致性,要么执行,要么不执行,mysql默认事务隔离级别:REPEATABLE-READ开启事务三个问题不可重复读:指在一个事务中,对同一数据进行
按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ)。MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别。你可以在命令行用–transaction-isolation选项,或在选项文件里,为所有连接设置...
在最后加上#可选参数有:READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ,SERIALIZABLE.2[mysqld]3transaction-isolation=REPEATABLE-READ这里全局默认是REPEATABLE-READ,其实MySQL本来默认也是这个级别2....
再加上很多书都说可重复读解决了幻读问题,比如《mysql技术内幕–innodb存储引擎》等,不一一列举了,因此网上关于事务隔离级别的文章大多是有问题的,所以再开一文说明! 本文所讲大部分内容,皆有官网作为佐证,...
MySQL的四种事务隔离级别:Read-uncommitted、Read-committed、Repeatable-read、Seriailizable,相信大家都清楚各自异同,不清楚的朋友可以查看另外一篇技术文章:MySQL_InnoDB之事务与锁详解。但是对于第二类、第...
数据库隔离级别有四种,应用《高性能mysql》一书中的说明: ...这里全局默认是REPEATABLE-READ,其实MySQL本来默认也是这个级别 2.对当前session修改,在登录mysql客户端后,执行命令: 要记住mysql有一个autoc
数据库事务隔离分为4个隔离级别。 MySQL的默认隔离级别就是Repeatable read。 由低到高: Read Uncommitted(读未提交) Read committed(读提交) Repeatable read(可重复读) Serializable(序列化 )。
目录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 ...
Repeatable Read –可重复读-(在当前事务内,重复读取第一次读取过的数据就叫可重复读。) 3、修改A端的隔离级别为readuncommitted –读未提交。意思是可以读取别人没有提交的数据。 set transactionisolation ...
MySQL数据库为我们提供的四种隔离级别: ... Mysql 的默认事务级别是: Repeatable read Oracle的默认事务级别是:Read committed 查看数据库的事务级别命令是:select @@tx_isolation;
并发访问问题 事务隔离级别 丢失修改 MySQL 所有事务隔离级别在数据库层面上均可避免 脏读 READ-COMMITTED 事务隔离级别以上可避免 不可重复读 REPEATABLE-READ 事务隔离级别以上可避免 幻读 SERIALIZABLE 事务隔离...
支持所有ANSI SQL隔离级别::serializable,:repeatable_read,:read_committed,:read_uncommitted。 另请参阅 gem,以获取有关死锁和序列化错误的自动重试事务。例子 ActiveRecord::Base.isolation_level( :...
5. MySQL的事务有哪些级别? 答:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)、串行izable(SERIALIZABLE) 6. MySQL的存储引擎有哪些? 答:InnoDB、MyISAM、Archive等 7. ...
# MySQL支持4种事务隔离级别,他们分别是: # READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. # 如没有指定,MySQL默认采用的是REPEATABLE-READ,ORACLE默认的是READ-COMMITTED log_bin = mysql...