MySQL添加字段造成回滚_alter table导致的mysql事务回滚失败

今天做数据迁移, 发现事务有时候可以回滚, 有时候不可以回滚, 最后一点点调试发现中间有段修改表结构的语句, 最终导致回滚失败。

1.MySQL最常用的两个表类型: InnoDB和MyISAM。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持、存储过程、视图、行级锁定等等高级数据库功能,若回滚失败,先检查表类型。

SHOW ENGINES 语句可以查看当前的数据库支持的存储类

81dfe63cc833121e40dc2fb307f56686.png

SHOW CREATE TABLE 表名;可以查看表的创建语句,最后有表的存储结构

9db984c424b4826200fb2da7a99bd2e6.png

ALTER TABLE 表名 ENGINE = InnoDB;修改表的存储类型

2.有的时候有些SQL语句会产生一个隐式的提交操作,即执行完成这些语句后,会有一个隐式的COMMIT操作。有以下SQL语句,不用你去“管”:

DDL语句,ALTER DATABASE、ALTER EVENT、ALTER PROCEDURE、ALTER TABLE、ALTER VIEW、CREATE TABLE、DROP TABLE、RENAME TABLE、TRUNCATE TABLE等;

修改MYSQL架构的语句,CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD;

管理语句,ANALYZE TABLE、CACHE INDEX、CHECK TABLE、LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE等

设计事务时,不应包含这类语句。如果在事务的前部中发布了一个不能被回滚的语句,则后部的其它语句会发生错误,在这些情况下,通过发布ROLLBACK语句不能 回滚事务的全部效果。

MySQL 数据表主要支持六种类型 ,分别是:BDB、HEAP、ISAM、MERGE、MYISAM、InnoBDB。

这六种又分为两类,一类是“事务安全型”(transaction-safe),包括BDB和InnoDB;其余都属于第二类,称为”非事务安全型”(non-transaction-safe)。

问题解决:

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。

InnoDB 是较新的事务安全型存储引擎,用于事务处理应用程序,支持BDB的几乎所有特性,并具有众多新特性,包括ACID事务支持。

特性:

事务处理机制

支持外链

崩溃后能立即恢复

支持外键功能,级联删除

支持并发能力

在硬盘上的存储方式:InnoBDB frm

最新版本的Mysql已经计划移除对BDB的支持,转而全力发展InnoDB。InnoDB对Mysql有更好的特性支持,而且开发社区活跃。

MyISAM 默认的MySQL插件式存储引擎,它是基于ISAM类型,但它增加了许多有用的扩展,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。

优点:

1.比ISAM表更小,所占资源更少

2.可以在不同平台间二进制移植表的类型在创建表时指定。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中隐藏字段是一种新特性,可以在不影响现有应用程序的情况下,向表中添加新的列。根据你的描述,似乎你想查询与隐藏字段相关的事务id和回滚id。我们可以通过以下步骤来查询: 1. 确定你想要查询的表名和隐藏字段名。假设你要查询的表名为“my_table”,隐藏字段名为“my_hidden_col”。 2. 执行以下查询语句,查看该表中的所有事务id: ``` SELECT trx_id FROM information_schema.innodb_trx; ``` 3. 执行以下查询语句,查看该表中所有被回滚的事务id: ``` SELECT DISTINCT r.trx_id FROM information_schema.innodb_trx r WHERE r.trx_state = 'R'; ``` 4. 执行以下查询语句,查看与隐藏字段相关的事务id: ``` SELECT DISTINCT r.trx_id FROM information_schema.innodb_trx r JOIN my_table t ON r.trx_id = SUBSTRING_INDEX(t.my_hidden_col, ':', 1) WHERE r.trx_state = 'R'; ``` 上述查询语句中,使用了JOIN连接和SUBSTRING_INDEX函数来查找与隐藏字段相关的事务id。其中,SUBSTRING_INDEX函数用于获取隐藏字段中的事务id,':'是隐藏字段中事务id与回滚id之间的分隔符。 5. 执行以下查询语句,查看与隐藏字段相关的回滚id: ``` SELECT DISTINCT r.trx_id, r.trx_state, r.trx_started, r.trx_mysql_thread_id, r.trx_query FROM information_schema.innodb_trx r JOIN my_table t ON r.trx_id = SUBSTRING_INDEX(t.my_hidden_col, ':', 1) WHERE r.trx_state = 'R'; ``` 上述查询语句中,使用了JOIN连接和SUBSTRING_INDEX函数来查找与隐藏字段相关的回滚id。其中,SUBSTRING_INDEX函数用于获取隐藏字段中的事务id和回滚id,':'是事务id和回滚id之间的分隔符。查询结果包括了事务id、事务状态、事务开始时间、MySQL线程id和事务执行的SQL语句等信息。 需要注意的是,隐藏字段只能在MySQL 8.0及以上版本中使用。如果你的MySQL版本低于8.0,将无法使用隐藏字段进行查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值