alter table导致的mysql事务回滚失败
今天做数据迁移, 发现事务有时候可以回滚, 有时候不可以回滚, 最后一点点调试发现中间有段修改表结构的语句, 最终导致回滚失败。
1.MySQL最常用的两个表类型: InnoDB和MyISAM。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持、存储过程、视图、行级锁定等等高级数据库功能,若回滚失败,先检查表类型。
SHOW ENGINES 语句可以查看当前的数据库支持的存储类
SHOW CREATE TABLE 表名;可以查看表的创建语句,最后有表的存储结构
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
支持外链
崩溃后能立即恢复
支持外键功能,级联删除
支持并发能力
在硬盘上的存储方式:InnoBDB frm
最新版本的Mysql已经计划移除对BDB的支持,转而全力发展InnoDB。InnoDB对Mysql有更好的特性支持,而且开发社区活跃。
MyISAM 默认的MySQL插件式存储引擎,它是基于ISAM类型,但它增加了许多有用的扩展,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。
优点:
优点:
1.比ISAM表更小,所占资源更少
2.可以在不同平台间二进制移植表的类型在创建表时指定。
2.可以在不同平台间二进制移植表的类型在创建表时指定。