一个简单的测试:

start transaction;

insert into tb1 values(3, repeat('a', 65000),'x',1);

--commit;

rollback;

下图分别是 tb1.ibd 在插入前,回滚前,回滚后的文件大小:

有人在QQ群问:为什么回滚会导致tb1.idb的磁盘空间增大?

-————————————–

首先:131072-98304=163840-131072=32768

这里要存储 65000 个字符’a’ ,那么字段类型应该是 text. 而 text 字段的处理是很特别的:

Each BLOB or TEXT value is represented internally by a separately allocated object. This is in contrast

to all other data types, for which storage is allocated once per column when the table is opened.

也就是说对于 text/blob 字段来说,它们是另外分配了一个专门的对象来存储,对它们的处理不会在内存中进行缓存,而是直接写入磁盘中。所以未提交时,就可以看到 tb1.idb 发生了增长。

而对于 insert 操作的 rollback,那么必须将之前插入的数据进行 delete 操作,而 delete 操作是逻辑操作,也就是设置一个标志位就行了,于是又分配了一个专门的对象来存储这个设置了删除标志的对象。于是磁盘空间增长了两次(暂时只能这么解释了…),每次都是 32768字节(2的15次方)。一旦提交或者rollback,磁盘空间就可以被回收。

为什么是 32768呢?

text的最大存储空间是 65656 个字节,每次分配的最小单位是 32768字节。

也就是 insert 和 rollback 都导致了一次 text 字段磁盘空间的增长分配,而分配的最小单位是32768.

如何你将 repeat(‘a’,65000) 换成: repeat(‘a’,65535) 在进行测试,你会发现,insert 时,tb1.idb会增长65536,在执行rollback时也会导致 tb1.idb 再次增长32768。

所以应该是 rollback 会导致 text 字段另外分配一次空间,而分配的最小单位是32768。可能和 text 字段的存储结构有关系。这个需要看源码了。

-—————

测试表明,其它非 text 字段的 rollback 操作,不会导致 ibd 文件增大。

测试建表语句如下:

mysql> show create table tb1\G

*************************** 1. row ***************************

Table: tb1

Create Table: CREATE TABLE `tb1` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`webtext` text COLLATE utf8mb4_bin,

`tp` varchar(2) COLLATE utf8mb4_bin DEFAULT NULL,

`se` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

1 row in set (0.00 sec)

https://www.cnblogs.com/digdeep/category/639153.html

mysql java事物回滚吗_为什么 MySQL 回滚事务也会导致 ibd 文件增大?相关推荐

  1. mysql ibd文件一直增加_为什么 MySQL 回滚事务也会导致 ibd 文件增大?

    一个简单的测试: start transaction; insert into tb1 values(3, repeat('a', 65000),'x',1); --commit; rollback; ...

  2. 为什么 MySQL 回滚事务也会导致 ibd 文件增大?

    一个简单的测试: start transaction; insert into tb1 values(3, repeat('a', 65000),'x',1); --commit; rollback; ...

  3. mysql 回滚失败_浅析Mysql 数据回滚错误的解决方法

    MYSQL的事务处理主要有两种方法.1.用begin,rollback,commit来实现begin 开始一个事务 rollback 事务回滚 commit 事务确认 2.直接用set来改变mysql ...

  4. mysql自动生成回滚语句_如何根据sql语句逆向生成回滚语句?

    当启动Binlog后,事务会产生Binlog Event,这些Event被看做事务数据的一部分.因此要保证事务的Binlog Event和InnoDB引擎中的数据的一致性.所以带Binlog的Cras ...

  5. java 回滚异常_Java异常与事物回滚探究

    非运行时异常(checke Exception)是RuntimeException以外的异常,类型上都属于Exception类及其子类.如IOException.SQLException等以及 用户自 ...

  6. java 不能回滚_Spring-Java事物回滚失效处理

    spring-Java事物回滚失效处理最近在做项目中,无意间发现有个类在抛事物回滚操作,数据也正常的插入到数据库当中了,于是仔细查看看一下具体原因. 一切还是要从Java的检查型异常和非检查型异常说起 ...

  7. djongo mysql 回滚_django事物回滚

    往数据库写入数据时,不经意间就会写入不完整的数据,我们称之为脏数据.事务管理(transaction)可以防止这种情况发生.事务管理一旦检测到写入异常,会执行回滚操作,即要么写入完整的数据,要么不写入 ...

  8. mysql数据库出现回滚_mysql数据库回滚

    在应用$mysqli时,因没常用到数据回滚,老忘,整理下,做个记录. $mysqli->autocommit(FALSE);//自动提交设置关闭 $mysqli->query(" ...

  9. service层自定义异常事物回滚

    今天在处理一个之前的订单业务逻辑,判断账户余额,不足则修改失败,所以直接就自己自定义了一个异常,然后抛出,controller中直接捕获,根据异常类型返回页面结果,但是问题来了,异常正常抛出,但是事物 ...

最新文章

  1. 表中的数据导出为insert语句的简单方法
  2. SonarQube与SonarRunner安装配置
  3. 【原创】Linux安装Redis
  4. R之Excel文件读取与程序包的安装调用
  5. 社区团购“九不得”:低价倾销、大数据“杀熟”被禁止
  6. python制作词作云动画_3分钟教你用python制作一个简单词云
  7. mysql分时间段查询_mysql分时间段查询
  8. gcc/g++ 编译与链接(2)
  9. js里apply用法
  10. 算法:Valid Sudoku(有效的数独)
  11. RTCM3.1/3.2
  12. windos读写ext3工具_Windows读写Ext3文件系统
  13. 分布式常见面试题总结(2021)
  14. 解决阿里云不能使用yum问题
  15. There is no 'root'@'%' registered解决
  16. 泰凌微ble mesh蓝牙模组天猫精灵学习之旅 ⑤ 阿里天猫精灵官方Genie BT mesh Stack框架:编译天猫精灵例程,实现语音控制!
  17. Android Studio 中的 gradle 介绍及build.gradle配置文件详解
  18. 《偏生要鲜花着景,应这急景流年》
  19. ARM M3小计(一)1~3章。
  20. 权值初始化 - Xavier和MSRA方法

热门文章

  1. 排序算法之 Heap Sort
  2. For web.config setting,reference the book of
  3. angular的post请求,SpringMVC后台接收不到参数值的解决方案
  4. java.lang.UnsupportedClassVersionError: JVMCFRE003解决方法--jdk 1.6 中switch的参数无法使用String类型
  5. 网易严选搜索推荐实践之:“全能选手”召回表征算法实践.pdf(附下载链接)...
  6. TI-ONE 全程助力算法大赛,承包你的比赛平台和计算资源
  7. android 广播反注册后,BroadcastReceiver注册、使用及其权限
  8. node ajax crud,基于node.js和rethinkdb的CRUD(增删改查)Web服务
  9. 饥荒联机版运行不了服务器,饥荒联机版启动服务器出现问题 | 手游网游页游攻略大全...
  10. 运输层课后第33题解析