让Mysql支持事务处理(修改数据库的存储引擎类型)
有时我们发现我们的Mysql数据库使用事务时无效,这很有可能是数据库使用的存储引擎(storage engine)不支持事务处理。比如创建数据库时的默认存储引擎“MyISAM”,它是性能优先的存储引擎,不支持事务处理。这时我们可以按下面步骤处理,解决MySQL不支持事务的问题。
一、查看数据库的存储引擎:
1、查看MySQL系统当前使用的存储引擎:
使用SQL“show variables like '%storage_engine%';”命令,可以查看MySQL系统当前使用的存储引擎:
2、查看指定数据库所有表使用的存储引擎:
使用“show table status from aiezu;”命令,可以查看指定数据库所有表使用的存储引擎,其中“aiezu”为数据库名。
3、查看指定表的存储引擎:
二、查看当前数据库系统支持的引擎:
使用show engines;命令可以查看当前数据库支持的引擎: 可以看出,笔者用的MariaDB-5.5.47,支持10种存储引擎,而这10种存储引擎中,只有“InnoDB”、“FEDERATED” 这两种存储引擎支持事务处理。
三、修改数据库存储引擎:
1、修改整个系统创建数据表时的默认存储引擎:
要让以后新建的数据表,默认使用支持事务处理的“InnoDB”做为默认存储引擎,修改“/etc/my.conf”文件,在“[mysqld]”下添加一行“default-storage-engine=InnoDB”,然后重启数据库即可:
2、修改已有数据表的存储引擎:
要将已有的数据表,修改为使用“InnoDB”作为默认存储引擎,通过“alter table”命令:
低版本:
四、测试MySQL事务处理:
MySQL使用BEGIN(或START TRANSACTION)、COMMIT、ROLLBACK三命令分别代表开始一个事务、提交事务、回滚事务,事务简单的流程如下:
事务的简单例子:
五、常见错误:
错误一:
这个错误是当前MySQL版本不支持type方式设置存储引擎的,将type关键词改成ENGINE 即可。
一、查看数据库的存储引擎:
1、查看MySQL系统当前使用的存储引擎:
使用SQL“show variables like '%storage_engine%';”命令,可以查看MySQL系统当前使用的存储引擎:
MariaDB [aiezu]> show variables like '%storage_engine%'; +------------------------+--------+ | Variable_name | Value | +------------------------+--------+ | default_storage_engine | MyISAM | | storage_engine | MyISAM | +------------------------+--------+ 2 rows in set (0.01 sec)
2、查看指定数据库所有表使用的存储引擎:
使用“show table status from aiezu;”命令,可以查看指定数据库所有表使用的存储引擎,其中“aiezu”为数据库名。
3、查看指定表的存储引擎:
MariaDB [aiezu]> show create table test; +-------+---------------------------------------------------------+ | Table | Create Table | +-------+---------------------------------------------------------+ | test | CREATE TABLE `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(36) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 +-------+----------------------------------------------------------+ 1 row in set (0.00 sec)
二、查看当前数据库系统支持的引擎:
使用show engines;命令可以查看当前数据库支持的引擎: 可以看出,笔者用的MariaDB-5.5.47,支持10种存储引擎,而这10种存储引擎中,只有“InnoDB”、“FEDERATED” 这两种存储引擎支持事务处理。
三、修改数据库存储引擎:
1、修改整个系统创建数据表时的默认存储引擎:
要让以后新建的数据表,默认使用支持事务处理的“InnoDB”做为默认存储引擎,修改“/etc/my.conf”文件,在“[mysqld]”下添加一行“default-storage-engine=InnoDB”,然后重启数据库即可:
[mysqld] ...省略N行,爱E族 aiezu.com ... default-storage-engine=InnoDB
2、修改已有数据表的存储引擎:
要将已有的数据表,修改为使用“InnoDB”作为默认存储引擎,通过“alter table”命令:
低版本:
mysql> alter table test type=INNODB; Query OK, 0 rows affected, 1 warning (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0高版本:
MariaDB [aiezu]> alter table test ENGINE=INNODB; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
四、测试MySQL事务处理:
MySQL使用BEGIN(或START TRANSACTION)、COMMIT、ROLLBACK三命令分别代表开始一个事务、提交事务、回滚事务,事务简单的流程如下:
--回滚的事务 BEGIN; -- 事务要执行的操作,update、delete等.. ROLLBACK; --提交的事务 BEGIN; -- 事务要执行的操作,update、delete等.. COMMIT;
事务的简单例子:
MariaDB [aiezu]> truncate table test; Query OK, 0 rows affected (0.00 sec) MariaDB [aiezu]> BEGIN; Query OK, 0 rows affected (0.00 sec) MariaDB [aiezu]> insert test(name,url) values('天猫','tmall.com'); Query OK, 1 row affected (0.00 sec) MariaDB [aiezu]> ROLLBACK; Query OK, 0 rows affected (0.00 sec) MariaDB [aiezu]> insert test(name,url) values('爱E族','aiezu.com'); Query OK, 1 row affected (0.01 sec) MariaDB [aiezu]> select * from test; +----+---------+-----------+ | id | name | url | +----+---------+-----------+ | 2 | 爱E族 | aiezu.com | +----+---------+-----------+ 1 row in set (0.00 sec)上面可以看出,插入的站点“天猫”,由于在事务里,事务被回滚,所以插入被撤销。但是它的“id:1”已经被其占用,所以后面成功插入的站点“爱E族”使用的ID是“2”。
五、常见错误:
错误一:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'type=innodb' at line 1解决方法:
这个错误是当前MySQL版本不支持type方式设置存储引擎的,将type关键词改成ENGINE 即可。
alter table test type=INNODB; --低版本 alter table test ENGINE=INNODB; --高版本