要点一中介绍过了事务的基本知识,那么,在mysql中又是如何处理事务的呢?
事务是由一组SQL语句构成的,它由一个用户输入时,并以修改成持久的或者滚到原来状态而终结。在MySQL中,在一个会话开始时,系统变量AUTOCOMMIT值为1,即自动提交功能是打开的,当用户每执行一条SQL语句后,该语句对数据库的修改就立即被提交成持久性修改保存到磁盘上,一个事务也就结束了。因此,用户必须关闭自动提交,事务才能由多条SQL语句组成。使用如下语句:
SET @@AUTOCOMMIT=0;
执行此语句后,必须明确地指示每个事务的终止,事务中的SQL语句对数据库所做的修改才能成为持久化修改。
例:执行如下语句:
delete from student where 学号=‘3160707001’
select * from student;
从执行结果中发现,表中已经删去了一行。但是这个修改并没有持久化,因为自动提交已经关闭了。用户可以通过ROLLBACK撤销这一修改,或者使用COMMIT语句持久化这一修改。
下面将具体介绍如何处理一个事务:
1.开始事务
当一个应用程序的第一条SQL语句或者在COMMIT或ROLLBACK语句后面的第一条SQL执行后,一个新的事务也就开始了。另外还可以使用一条START TRANSACTION语句来显式地启动一个事务。
语法格式:START TRANSACTION | BEGIN WORK
一条BEGIN WORK语句可以用来替代START TRANSACTION语句,但是START TRANSACTION更常用一些。
2.结束事务
COMMIT语句是提交语句,它使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,也标志着一个事务的结束,其语法格式为:
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
3.撤销事务
ROLLBACK是撤销语句,它撤销事务所做的修改,并结束当前这个事务。语法格式:、
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
在前面的举例中,若在最后加上以下这条语句
rollback work;
执行完这条语句后,前面的删除动作将被撤销,可用select语句查询该行数据是否还原。
4.回滚事务
除了撤销整个事务,用户还可以使用ROLLBACK TO语句使事务回滚到某个点,在这之前需要用SAVEPOINT语句来设置一个保存点。
SAVEPOINT语法格式:
SAVEPOINT identifier
其中identifier为保存点的名称。
ROLLBACK TO SAVEPOINT语句会向已命名的保存点回滚一个事务。如果在保存点被设置后,当前事务对数据进行了更改,则这些更改会在回滚中被撤销,其语法格式:
ROLLBACK [WORK] TO SAVEPOINT identifier
当事务回滚到某个保存点后,在该保存点之后设置的保存点将被删除。
RELEASE SAVEPOINT语句会从当前事务的一组保存点中删除已命名的保存点。不出现提交或回滚。如果保存点不存在,会出现错误。其语法格式为:
RELEASE SAVEPOINT identifier