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;


应该可以在另一个连接中查询新的订单记录。