13.3.2 通过InnoDB使用事务
在默认的情况下,MySQL是以自动提交(autocommit)模式运行的。这就意味着所执行的每一个语句都将立即写入到数据库(提交)中。如果我们使用事务安全的表格类型,很可能不希望这种行为。
要在当前的会话中关闭自动提交,输入如下所示的命令:
set autocommit=0;
如果自动提交被打开了,必须使用如下所示语句开始一个事务:
start transaction;
如果自动提交是关闭的,不需要使用以上命令,因为当输入一个SQL语句时,一个事务将自动启动。
在完成了组成事务的语句输入后,可以使用如下所示语句将其提交给数据库:
commit;
如果改变主意,可以使用如下所示语句回到数据库以前的状态:
rollback;
只有提交了一个事务,该事务才能在其他会话中被其他用户所见。
下面,让我们来看一个例子。在books数据库中,执行本章上一节给出的ALTER TABLE语句。如果还没有执行此操作,请使用如下语句:
alter table orders type=innodb;
alter table order_items type=innodb;
这些语句可以将两个表格转换成InnoDB表格(如果希望使用type=MyISAM运行相同的语句,还可以将表格类性转换回来)。
现在,打开两个到books数据库的连接。在一个连接中,在数据库中添加一个新的订单记录:
insert into orders values(5,2,69.98,'2008-06-18');
insert into order_items values(5,'0-672-31697-8',1);
现在检查一下能否看到新的订单:
select*from orders where orderid=5;
应该看到如下所示的订单记录:
+————-+——————+————+——————+
|orderid|customerid|amount|date|
+————-+——————+————+——————+
|5|2|69.98|2008-06-18|
+————-+——————+————+——————+
保持该连接的打开状态,进入到另一个连接,运行相同的SELECT查询。将无法看到该订单记录:
Empty set(0.00 sec)
(如果可以看到该订单记录,很可能是没有关闭自动提交。检查自动提交并且确认将表格类型转换成InnoDB格式)。其原因就是事务还没有被提交(这是事务孤立性的很好说明)。
现在回到第一个连接并且提交该事务:
commit;
应该可以在另一个连接中查询新的订单记录。