让Mysql支持事务处理(修改数据库的存储引擎类型)

  有时我们发现我们的Mysql数据库使用事务时无效,这很有可能是数据库使用的存储引擎(storage engine)不支持事务处理。比如创建数据库时的默认存储引擎“MyISAM”,它是性能优先的存储引擎,不支持事务处理。这时我们可以按下面步骤处理,解决MySQL不支持事务的问题。
 
一、查看数据库的存储引擎:
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;命令可以查看当前数据库支持的引擎:
QQ图片20161118104554.png
可以看出,笔者用的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;  --高版本

0 个评论

要回复文章请先登录注册