`

MySQL事务的隔离级别和日志记录模式选择

阅读更多

导读:

MySQL的四种事务隔离级别:Read-uncommitted、Read-committed、Repeatable-read、Seriailizable,相信大家都清楚各自异同,不清楚的朋友可以查看另外一篇技术文章:MySQL_InnoDB之事务与锁详解。但是对于第二类、第三类隔离级别之间的性能区别和应用场景就会容易出现一些理解上的偏差,尤其是熟悉Oracle的技术朋友,为此专门撰写一篇技术文章,引导大家合理地选择这两种事务隔离级别。

测试环境及名词解释:

操作系统:CentOS release 5.5 (Final)

MySQL版本:5.1.40-community-log

InnoDB版本:build-in

测试的事务隔离级别:Read-committed(以下简称:RC)、Repeatable-read(以下简称:RR)

日志登记选项(简称:LBO):STATEMENT-based logging(简称:LBS)、

ROW-based format(简称:LBR)

基于日志复制模式(简称:RBO):STATEMENT、ROW、MIXED

事务隔离级别和日志模式组合的分析和总结:

n事务隔离级别为:Read-committed(简称:RC)

事务安全性:不支持对InnoDB引擎表作DML(DML指:INSERT、UPDATE、DELETE),但是允许对非事务引擎表的数据进行一切操作;

事务性能:不支持对事务引擎InnoDB表进行操作;

uRCSTATEMENT配置组合

日志记录格式:所有的变更操作都以基于命令方式登记二进制日志(简称:LBS);

复制安全性:对于SQL语句中,若存在不确定性的函数,则数据复制存在一致性;

IO量:无增加;

uRCMIXED配置组合

事务安全性:结合InnoDB提供的MVCC功能,可以做到只看见已经提交事务修改后的数据,但是无法确保同一事务内,同一个查询语句二次执行,

获得的记录集相同;

事务性能:会比不提交读隔离级别性能低,但比可重复读隔离级别性能高;

日志记录格式:所有的变更操作都以基于行模式登记二进制日志(简称:LBR);

复制安全性:能做到主备数据复制的一致性;

IO量:所有的DML操作都将转化成基于行模式登记二进制日志,那么会增加大量物理写IO;

uRCROW配置组合

若是事务隔离级别设置为:Read-committed(以下简称:RC),那么无论日志模式(注:binlog_format)设置为:MIXED 或者 ROW,二进制日志都将以ROW模式登记,为此与RC+MIXED配置组合相同,不赘述。

n事务隔离级别为:Repeatable-read(简称:RR)

事务安全性:在RC隔离级别优点的基础之上,做到了同一个事务内,同一个查询请求,多次执行,获得的记录集一定相同;

事务性能:比RC事务隔离级别消耗的资源更多一些,也即性能低一些,但比

Seriailizable隔离级别的性能好;

uRRSTATEMENT配置组合

日志记录格式:基于命令行模式登记二进制日志(简称:LBS);

复制安全性:对于SQL语句中,若存在不确定性的函数,则数据复制存在一致性;

IO量:无增加;

uRRMIXED配置组合

日志记录格式:对于SQL语句中无不确定性函数的DML操作,则会基于命令行模式登记二

进制日志(简称:LBS);但是对于包含不确定性函数的DML操作,则一定

会使用基于行模式登记二进制日志(简称:LBR)

复制安全性:能确保数据复制的正确性;

IO量:相比STATEMENT可能会增加,但是否增加二进制的量,主要看编写的SQL语句,是否包含一些不确定性的函数;

uRRROW配置组合

日志记录格式:对于所有的DML操作,都采用基于行的模式登记二进制日志,;

复制安全性:能确保数据复制的正确性;

IO量:全采用基于行的模式登记二进制日志,将明显增加物理IO;

事务隔离级别和日志模式组合适用的场景阐述:

uRCSTATEMENT配置组合

结合上述的分析和总结,提交读+基于命令行模式。首先是跑事务引擎的mysqld服务,不支持此组合模式,那么其适合场景:

1>.使用非事务引擎存储数据、支撑业务,不使用事务引擎 (一般指:InnoDB引擎);

2>.不需要使用到mysql复制的架构,或者SQL语句确定不包含不确定性函数等内容;

uRCMIXED配置组合

1>.允许事务中,存在同一个SQL查询语句多次执行获得的记录集不同,或者规避此类业务;

2>.读操作量远远大于写操作的业务场景;

3>.不需要打开二进制日志功能的业务场景;

uRCROW配置组合

对于事务隔离级别:RC,无论binlog_format设置为:MIXED 还是 ROW,其二进制日志登记模式都一样,所以其适合场景与RCMIXED配置组合一样。

uRRSTATEMENT配置组合

1>.需要确保事务中,同一个SQL查询语句多次执行获得的记录集相同的业务场景;

2>.不需要关心读写比例的业务场景;

3>.不使用mysql的复制功能,或者DML操作SQL确保不存在不确定性的内容;

uRRMIXED配置组合

1>.需要确保事务中,同一个SQL查询语句多次执行获得的记录集相同的业务场景;

2>.需要使用mysql的复制功能,且不想关心 DML操作类SQL语句是否存在不确定性的内容;

3>.更新操作量还是比较多,且想减少登记二进制日志而增加的物理IO,以及加速mysql复制的速度;

uRRROW配置组合

1>.需要确保事务中,同一个SQL查询语句多次执行获得的记录集相同的业务场景;

2>.需要使用mysql的复制功能,且不想关心 DML操作类SQL语句是否存在不确定性的内容;

3>.以读为主的业务,更新量较少且从设计上规避行模式登记日志缺陷的业务场景;

推荐组合模式:

若需要打开二进制日志功能,且需要使用mysql复制,但业务是以读为主,且更新量为主的表,被设计成非常轻小型,也不想严格关心SQL写法。例如:常更新的字段放一起且最好是整形的,不常更新的字段存放一起,一定无大字段(注释:TEXT、BLOB等)。那么可以考虑使用:RC+MIXED组合模式。

若需要打开二进制日志功能,且需要使用mysql复制,但业务的读写量相差不大,且不想为规避登记二进制日志的问题而设计表,也不想严格关心SQL写法,那么建议使用:RR+MIXED组合模式

当然对于不需要打开二进制日志功能的业务,那选择就容易,关键在选择事务隔离级别为:RC还是RR的问题,为事务安全性角度出发,选择:RR,为从事务消耗资源,也即性能出发,选择:RC。

为方便大家阅读,以及适应快餐式文化氛围,文章开头特意先写对比、分析和结论,那么接下来将把测试过程,以及一些对比信息告诉大家,建议一线技术人员一定要看下测试过程.测试过程,也是分设置不同事务隔离级别tx_isolation的值,配合设置不同binlog_format的值,然后执行数据的更新语句,再使用mysqlbinlog工具解读二进制日志文件的内容。

测试用例:

u 测试表的数据

备注: 测试过程中,更新ID=1 和 ID=4 的纪录。

u 用于测试的SQL



测试对比信息过程:

uRCSTATEMENT配置组合

MySQL 5.1系列设置RC+STATEMENT组合的模式,无法对支持事务的InnoDB引擎作数据更新操作,为此我们在实际的生产环境中无法使用,当然若关闭mysql的二进制日志登记功能是可以的,或者打开允许不安全模式登记二进制日志的参数,也是可以的。

uRCMIXED配置组合

事务隔离级别、日志模式、执行的SQL信息:

紧接着我们翻译二进制日志信息,看下二进制日志中登记的内容是啥?

1>.1SQL对应的二进制日志信息

我们只修改了TIMESTAMP类型字段字段:alterDate的值,其他值都没有变化,但是都被记录到二进制日志中,而且在WHERE 和SET 部分都有出现。

2>.3号SQL语句对应的二进制日志信息



备注:

编号为:3的SQL语句中使用了范围条件更新日期的方式,并且日期值也特意加入了随机函数,但从二进制日志中,我们可以发现,都是固定的值和只登记了更新到的记录内容。

对于其他SQL更新产生的内容也是类似的,其他3条SQL语句执行后,在二进制日志文件中登记的内容,读者们可以自己使用:mysqlbinlog –v –v 二进制日志文件 方式查看,节省点篇幅,文章后面我们总结日志记录特点。

uRCROW配置组合

我们从RC+MIXED配置组合测试的内容,可以看到其全部转换成了行模式登记二进制日志文件内容,那么此模式就没有多阐述的地方,我们错开的方式,察看下编号为:4的SQL二进制日志信息,如图:

备注:

编号为4的SQL中涉及不确定性函数:UUID(),WHERE条件为:范围扫描,真实记录的二进制日志内容,都是固定的字段属性值,和真实被更新到的记录。

uRRSTATEMENT配置组合

请读者注意标注红线的地方,对于存在随机数函数,以及不确定性的UUID函数,二进制日志文件都是原样登记的,含有这些不确定性函数的SQL再次执行,将无法获得相同的值,这会给mysql的复制带来麻烦,以及使用二进制日志进行数据恢复的时候。

uRRMIXED配置组合

此部分我们重点看2部分的日志,一部分是选择以命令行模式登记的二进制日志,另外一类是选择以行模式登记的二进制日志,第一类,如图:

请读者再回味下上一个节点:RR+STATEMENT组合产生的二进制日志,对比我们会发现,其都是以基于命令行模式,但是RR+MIXED组合配置,则增加了一些内容,例如图中红色字段部分,为使大家看得更详细,关于如何处理随机函数的问题,以确保在二进制日志用于恢复的时候,确保SQL产生的记录值是永恒固定的,再单独截图一张:

接下来我们再看下,对于无法通过添加类似Oracle的hint内容,解决不确定性函数登记到二进制日志文件中的问题,先看二进制日志截图:

对于mysqld没有支持或无法通过添加类似hint模式解决的不确定性问题,RR+MIXED模式下,二进制日志登记将会以行模式登记二进制日志,而解决不确定性问题。

uRRROW配置组合

对于RR+ROW组合配置,所有DML操作的SQL日志都是以基于行模式登记,为此我们只看编号为:1、4两条SQL的二进制日志内容,编号为1的SQL对应的二进制日志内容,如图:

接下来我们再看下编号为:4的SQL对应的二进制日志内容,如图:

通过阅读翻译后的二进制日志详细内容,以及对比不同事务隔离级别和binlog_format配置组合情况下,登记的二进制日志, 我们可以分析、总结出如下内容:

l 二进制日志文件中,表结构中字段名成都是用@符号,加数字编号的模式,且是按字段先后顺序编号的方式,此地方就是一个风险点,尤其双主复制模式 下,后续篇章讲解复制存在的风险点详细告诉大家;

l RC模式下对事务引擎:InnoDB是全部采用行模式记录二进制日志;

l 行模式登记二进制日志时,字段的原内容是全部出现在:WHERE部分,需要被修改后的内容全部显示在:SET部分,为此若表字段多或有大字段,对数据做变更之时,产生的二进制日志内容将会很大,从而消耗大量系统的物理IO资源;

l 行模式登记二进制日志时,对于字段值更新的SQL中不确定性的内容,将会替换为确定性的值登记到二进制日志文件中;

l 行模式登记二进制日志时,若DML操作SQL语句,使用了范围条件,而登记到二进制日志中的内容,是实际更新的条数详细内容,此模式也会增加大量二进制日志的容量;

l 行模式登记二进制日志时,若是表有大字段或者某个表字段很多,那么产生的二进制日志容量就会非常大了,意味着消耗系统的物理IO资源将会急剧增加;

l Binlog_format设置为:MIXED,对于二进制日志以基于命令行模式还是基于行模式登记,取决于:事务隔离级别和所涉及的SQL共同决定,但是对于RC事务隔离级别,就无论什么类型的DML操作SQL,都以行模式登记;

l 事务隔离级别为:RC情况下,binlog_format设置为MIXED还是为ROW,对于二进制日志登记而言都是一样的,以行模式登记二进制日志。

l 事务隔离级别为:RR情况下,binlog_format设置为MIXED,mysqld服务会根据DML操作的SQL语句情况,决定是以行模式登记二进制日志,还是以 命令行模式登记;

l 事务隔离级别为:RR情况下,binlog_format设置为MIXED,mysqld服务会添加类似Oracle的hint内容,解决部分不确定性函数而带来的SQL重复执行无法获得相同记录值的问题;

分享到:
评论

相关推荐

    MySQL之事务和redo日志.doc

    综上所述,MySQL的事务和redo日志是数据库管理系统中确保数据安全和可靠性的核心机制,它们通过原子性、一致性、隔离性和持久性保证了数据的正确处理,并通过redo日志实现数据的快速恢复,即便在系统故障的情况下。

    详解 Mysql 事务和Mysql 日志

    MySQL 事务是数据库管理系统中的核心概念,用于确保数据的一致性和完整性。事务具有四个关键特性,也被...合理设置事务隔离级别和正确使用日志可以有效地预防和解决并发问题,同时确保在故障情况下能够快速恢复数据。

    MySQL面试题进阶版附答案高难度深入挖掘MySQL的核心概念与技术探索ACID特性、事务隔离级别、索引优化、连接操作

    2. **事务隔离级别**: - 读未提交:最低隔离级别,可能导致脏读、不可重复读和幻读。 - 读已提交:防止脏读,但可能出现不可重复读。 - 可重复读:防止不可重复读,但可能有幻读(InnoDB引擎通过多版本并发控制...

    MYSQL中事务、日志、锁

    通过对MySQL中事务、Redo日志、Undo日志以及隔离级别的详细介绍,我们可以看出这些机制是如何协同工作以确保数据的一致性和完整性的。正确理解和应用这些机制对于构建高性能、高可靠性的数据库应用程序至关重要。

    mysql用户权限与日志(MySQL用户、访问鉴权、日志记录系统、日志配置查看、InnoDB事务日志等)..docx

    这些日志用于实现事务的原子性、一致性、隔离性和持久性(ACID)。InnoDB事务日志由一组文件组成,每个文件的大小可通过`innodb_log_file_size`参数配置。默认情况下,InnoDB会创建两个文件,并且可以在运行时动态...

    一个关于mysql 事务管理的介绍

    在实际应用中,选择合适的事务隔离级别和存储引擎,以及明智地使用事务管理语句,是确保数据安全性和应用程序可靠性的关键。理解并熟练掌握MySQL的事务管理对于任何数据库开发者都是至关重要的。

    mysql中的事务、锁讲解和操作

    在实际应用中,根据业务需求和性能考虑,开发人员需要合理选择合适的事务隔离级别和锁类型。例如,读多写少的场景可以使用较低的隔离级别以提高并发性能,而在需要严格一致性的场景下,则应选择更高的隔离级别。 ...

    聊聊MySQL事务的特性和隔离级别

    MySQL事务的特性和隔离级别是数据库管理中的关键概念,它们对于确保数据的...选择合适的事务隔离级别可以平衡数据一致性与系统性能之间的需求。在实际应用中,应根据业务场景和性能需求来合理设置MySQL事务的隔离级别。

    解决Mysql收缩事务日志和日志文件过大无法收缩问题

    3. 调整事务隔离级别:根据业务需求,合理选择事务隔离级别,如读已提交(READ COMMITTED)可以减少事务日志的记录。 总的来说,管理和优化数据库事务日志是确保数据库高效运行的关键。理解并正确使用各种数据库...

    MySQL事务剖析1

    综上,MySQL事务处理是数据库系统中不可或缺的部分,它通过ACID特性、隔离级别、MVCC和锁机制确保数据的一致性,并在Java、Spring等开发环境中提供了便捷的事务管理接口。理解并合理使用这些概念和机制,对数据库...

    MySQL事务表和非事务表的区别1

    即使MySQL服务器崩溃或遇到硬件问题,可以通过自动恢复或结合事务日志和备份恢复数据。此外,可以使用COMMIT提交事务,或者在需要时用ROLLBACK撤销更改。相比之下,非事务安全表的更改一旦执行,就会立即持久化,...

    MySql事务处理.docx

    MySQL 事务处理是数据库管理系统中的关键特性,主要用于确保数据操作的安全性和一致性。在MySQL中,事务主要应用于支持事务的存储引擎,如InnoDB或BDB。这些存储引擎能够提供事务的四大特性:原子性(Atomicity)、...

    MySQL 事务(五).pdf

    MySQL事务管理是数据库操作的核心部分,通过掌握事务的基础概念、ACID属性、控制语句、隔离级别等内容,可以有效地管理和优化数据库操作,从而提高系统的稳定性和性能。对于数据库管理员、后端开发者和数据分析师来...

    Mysql事务处理详解

    MySQL事务处理详解主要涵盖事务的基本概念、特性以及事务隔离级别,这些都是数据库管理中至关重要的概念。MySQL中的事务主要用于处理大量且复杂的操作,确保数据的一致性和完整性。 首先,事务是MySQL数据库操作的...

    MySQL 主从复制模式全面实践

    但它存在事务隔离性和数据一致性的问题。 - **多主监控(Master-Master-Monitor)**:三台机器互相作为对方的主服务器,但存在复制延迟和数据同步问题。 - **一从对多主(One Slave to Multiple Masters)**:这种...

Global site tag (gtag.js) - Google Analytics