今天在编写程序的时候进行了回滚操作,程序运行正常,但是数据库并没有进行回滚操作。百度后发现自己创建的表类型是MyISAM,不支持事务操作,后改为InnoDB即能进行回滚操作。下面简单介绍两种数据表类型以及更改数据库类型为InnoDB的操作。

一 MySql支持的数据引擎

  • MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。
  • InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。
  • BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性。
  • Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。
  • Merge:允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。
  • Archive:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。
  • Federated:能够将多个分离的MySQL服务器链接起来,从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。
  • Cluster/NDB:MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。
  • Other:其他存储引擎包括CSV(引用由逗号隔开的用作数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速创建定制的插件式存储引擎提供帮助)。

二 MyISAM引擎和InnoDB引擎的基本差别

  • MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
  • MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
  • MyIASM是IASM表的新版本,有如下扩展:二进制层次的可移植性、NULL列索引、对变长行比ISAM表有更少的碎片、支持大文件、更好的索引压缩等
  • InnoDB不支持FULLTEXT类型的索引
  • InnoDB 中不保存表的具体行数
  • 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引
  • DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除
  • MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的 顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量 的SELECT,MyISAM是更好的选择。 
  • InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表

三 更改数据库类型为InnoDB的操作

1 首先看数据库是否支持InnoDB,不支持的话,具体操作可看我上篇关于Sqlyongl安装出现问题的解决办法的博客。

数据库中查看是否支持InnoDB引擎的sql语句:SHOW ENGINES; 

MySql中无法回滚的原因及解决办法_mysql


2  查看数据表的类型:

 sql语句:

SHOW TABLE STATUS LIKE 'tbl_name';
SHOW CREATE TABLE tbl_name;

MySql中无法回滚的原因及解决办法_mysql_02


3 更改数据表类型

sql语句: alter table tablename type=innodb;

在SqlYong中可直接修改:点击一个表名,右键,Alter table-Advanced Properties-Type-InnoDB-OK即可。(如果没有找到InnoDB,说明数据库不支持InnoDB引擎,则回到第一步重新操作)。

MySql中无法回滚的原因及解决办法_mysql_03

完成上面以后此数据库就能支持事务操作了。