关于MySQL记录非事务性语句的疑问

MySQL 版本:mariadb 5.5.30

OS版本: centos 5.6 x86_64

摘自网络一段话:“事务是按照提交的顺序写入binlog内,MySQLserver 为区分不同的线程的语句,为每个线程都保持一个事务缓存,事务中执行的每个语句都放在事务缓存中,然后事务缓存的内容被复制到binlog中,且在事务提交时被清空。”

以上这句话我是认同的,下面我们探讨下binlog如何记录非事务性语句;

当没有事务活动时,非事务性语句会被直接写入binlog里面而不需要经过事务缓存;

如果一个事务是活动的,可分为下面的情况处理:

1、语句被标记为事务的,则被写入事务缓存(这句话不需要验证)

2、语句没有被标记为事务性的,而且事务缓存中没有语句(即该语句作为事务的开头),则该语句被直接写入binlog;

验证过程:

MyISAM 表: not_trans;  Innodb 表:trans;

commit;之后;验证binlog是否有 insert into not_trans 记录

对于 binlog format: mixed 和 为statement的时候 都会有该记录;所以第二种情况是正确的

3、语句未被标记为事务性的,但事务缓存中有该事务的其他语句,则该语句被写入事务缓存

验证过程: 对事务性表和非事务性表 放在一个事务中,插入后不进行commit 而是进行 rollback操作(注:此时根据会提示warning,非事务性表无法回滚),此时按照第三种情况来说,binlog里面应该没有任何binlog记录;

MyISAM 表: not_trans;  Innodb 表:trans;

查看binlog进行验证:

对于binlog mixed  和statement 格式存储, binlog里面都会有 非事务性语句的记录,并且后面是 rollback结尾;

我觉得第三种情况是错误的,(对于这次测试有什么疑问大家可以共同探讨)

补充:第三种情况 非事务性语句也许已经写入到事务缓存中,但由于在本实验中rollback失败,所以非事务性语句直接写入到binlog中;或许是非事务性语句根本就没写入到事务缓存中,未排除这两种可能,各位有什么方法来验证下吗?

这个时候我们要提一下MySQL的一个相关参数:binlog_direct_non_transactional_updates

首先这个是让非事务性的语句直接写入到binlog里面,但该参数有些鸡肋啦。在binlog format 为 statement的时候,该参数能起到作用,目前和版本没有关系;但在MySQL 5.5.5之后的版本,对于binlog format 为 mixed 或者 row 模式的情况下,该参数对binlog 是没有任何影响的!(大多数人使用的是mixed模式吧)

本文出自 “技术成就梦想” 博客,请务必保留此出处http://weipengfei.blog.51cto.com/1511707/1206939

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/MySQL/

时间: 2024-09-30 15:46:11

关于MySQL记录非事务性语句的疑问的相关文章

mysql删除重复记录的sql语句与查询重复记录(1/4)

方法1 delete yourtable where [id] not in ( select max([id]) from yourtable group by (name + value)) 方法2 delete a from 表 a left join( select (id) from 表 group by name,value )b on a.id=b.id where b.id is null 查询及删除重复记录的sql语句 查询及删除重复记录的sql语句 1.查找表中多余的重复记录

mysql删除重复记录的sql语句与查询重复记录

方法1 delete yourtable where [id] not in ( select max([id]) from yourtable group by (name + value)) 方法2 delete a from 表 a left join(select (id) from 表 group by name,value)b on a.id=b.id where b.id is null 查询及删除重复记录的sql语句 1.查找表中多余的重复记录,重复记录是根据单个字段(peopl

透视MySQL数据库之更新语句

用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.UPDATE以及DELETE.在MySQL中又多了一个REPLACE语句,因此,本文以MySQL为背景来讨论如何使有SQL中的更新语句. 一.INSERT和REPLACE INSERT和REPLACE语句的功能都是向表中插入新的数据.这两条语句的语法类似.它们的主要区别是如何处理重复的数据.

检索MYSQL记录

 3.6 检索记录    除非最终检索它们并利用它们来做点事情,否则将记录放入数据库没什么好处.这就是SELECT 语句的用途,即帮助取出数据.SELECT 大概是SQL 语言中最常用的语句,而且怎样使用它也最为讲究:用它来选择记录可能相当复杂,可能会涉及许多表中列之间的比较.SELECT 语句的语法如下:    除了词" S E L E C T"和说明希望检索什么的column_list 部分外,语法中的每样东西都是可选的.有的数据库还需要FROM 子句.MySQL有所不同,它允许对

select-关于mysql中查询重复数据的疑问

问题描述 关于mysql中查询重复数据的疑问 我有一个表叫做sc. 现在要查询score中有相同分数的信息, 查询的sql语句是 select * from sc where score in (select score from sc group by score having count(score)>1); 我很好奇的是group by的执行顺序是比 having先执行啊, 按道理,执行了之后重复的score值是没有的,怎么还能再用having 来查出count(score)>1 的重复

MySQL的常用SQL语句

修改密码 这是常见的大家一般都要用的 首先安装成功了打开cmd –> mysql -u root -p –>输入你的密码 –>修改mysql root用户密码 格式:mysql> set password for 用户名@localhost = password('新密码'); 举例:mysql> set password for root@localhost = password('root'); 上面例子将用户root的密码更改为root: 如果是学习使用一般密码该简单些

MySQL ORDER BY排序语句用法与优化

MySQL Order By语法  代码如下 复制代码  SELECT column_name(s) FROM table_name ORDER BY column_name 注意:SQL语句是"字母大小写不敏感"的语句(它不区分字母的大小写),即:"ORDER BY"和"order by"是一样的. MySQL Order By案例 下面的例子:从"Person"表中选取所有记录,并将"Age"列进行分类

mysql记录根据日期字段倒序输出_Mysql

我们知道倒序输出是很简单的 select * from table order by id desc 直接这样就可以 那么现在的问题在于日期字段怎么来倒序输出 这里我们用到cast()来将指定的字段转换为我们需要的类型 如下是实际项目中的sql语句 select * from water where phoneNumber=@phoneNumber order by cast(date as datetime) desc 我们说学而不思则罔,我们来思考下深层次的内容. 经过查阅资料得知类型的转换

详解MySQL数据库之更新语句

用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的 SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之 意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.UPDATE以及DELETE.在MySQL中又多了一个REPLACE语句,因此,本文以MySQL为背景来讨论如何使有SQL中的更新语句. 一.INSERT和REPLACE INSERT和REPLACE语句的功能都是向表中插入新的数据.这两条语句的语法类似.它们的主要区别是如何处理重复的数据