一、查看服务器上MySQL支持的ENGINE
SHOW ENGINES;
只有InnoDB支持transaction。
二、查看数据库事务提交方式
SELECT @autocommit;
运行此语句,结果是,
mysql> select @autocommi
+-------------+
| @autocommit |
+-------------+
| NULL |
+-------------+
1 row in set (0.03 sec)
这说明,我的MySQL是手动提交事务的。而在MyISAM情况下,是不支持事务的,虽然一旦运行了一条语句就不可恢复,也不能据此认为事务提交状态是自动的,因为根本就和事务没有关系。
三、如何使用事务
我没有掌握,不知道如何开启事务,如何结束事务。或者说,我看到了多种方法,不知道究竟应该用那种方法。不过,我可以暂时用下面的SQL语句来使用事务。下面的代码,通过了测试。
MyISAM table
-- 结合该文件和trans-tables.sql理解非事务性表和事务性表
-- Filename:non-trans-tables.sql
DROP TABLE IF EXISTS non_trans_parent;
CREATE TABLE non_trans_parent
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
val VARCHAR(10) NOT NULL,
PRIMARY KEY(id),
UNIQUE KEY(val)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS non_trans_child;
CREATE TABLE non_trans_child
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
parent_id INT UNSIGNED NOT NULL,
created TIMESTAMP NOT NULL,
PRIMARY KEY(id),
INDEX (parent_id)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- Test
START TRANSACTION;
INSERT INTO non_trans_parent(val) VALUES ('a');
INSERT INTO non_trans_child(parent_id,created) VALUES (LAST_INSERT_ID(),NOW());
InnoDB table
-- 结合该文件和trans-tables.sql理解非事务性表和事务性表
-- Filename:trans-tables.sql
DROP TABLE IF EXISTS trans_parent;
CREATE TABLE trans_parent
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
val VARCHAR(10) NOT NULL,
PRIMARY KEY(id),
UNIQUE KEY(val)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS trans_child;
CREATE TABLE trans_child
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
parent_id INT UNSIGNED NOT NULL,
created TIMESTAMP NOT NULL,
PRIMARY KEY(id),
INDEX (parent_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- Test
START TRANSACTION;
INSERT INTO trans_parent(val) VALUES ('a');
INSERT INTO trans_child(parent_id,created) VALUES (LAST_INSERT_ID(),NOW());
这两个table的唯一区别是使用的ENGINE不同。
在测试中,运行上述代码后,我再执行下面的代码
INSERT INTO trans_parent(val) VALUES ('a');
INSERT INTO non_trans_parent(val) VALUES ('a');
之后,再分别执行ROLLBACK,发现,在MyISAM的表中,表并没有恢复到事务之前的状态,而在InnoDB中,表恢复到了事务之前的状态。这就是事务性表和非事务性表的差别。
此外,我还发现,开启事务,用的语句是
START TRANSACTION;
提交事务,语句是
COMMIT;
而相关的网络资料是这样的:
MYSQL的事务处理主要有两种方法。
1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认
2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!
个人推荐使用第一种方法!
URL:http://www.cnblogs.com/in-loading/archive/2012/02/21/2361702.html
这种方法,和我测试通过的代码开启事务的方法不同。对于网络资料中的第二种,我也不理解。在上面的trans_table.sql中,需要commit后事务数据才不可回滚,这是否说明,我的MySQL是默认禁止非自动提交的。有待研究。