有时我们发现我们的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;命令可以查看当前数据库支持的引擎:
可以看出,笔者用的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; --高版本