事务

一个事务由一系列的数据库操作构成。就并发性和恢复控制的角度来看,其具有''原子性'',也就是说在一个事务中要么所有的操作都执行,要么一个操作也不执行。事务的这个特性对于保证数据库的一致性是很非常必要的。

例如,一个事务可以进行转帐,它包含以下两个子操作:把一笔数额的钱款加到帐户A上(一个或多个INSERT操作)和从另一个帐户B上把相同数额的钱款扣除(可能是UPDATE,但可能和前面的INSERT所操作的是不同的表)的操作。如果这两个操作放在同一个事务中,那么数据库就没有不一致的危险,因为或者以上两个操作都完成,或者两者都无效。如果以上两个涉及转帐的操作分别放在两个不同的事务中,那么数据库就有不一致的危险,因为可能出现一个事务完成了而另一个事务却是无效的情况。

在数据库中,一个连接可能处于两种状态,一种是''事务未提交''状态,一种是''事务已提交''状态。这两个状态是和数据库是否处于一致状态相关联的,前者表明数据库可能处于不一致状态,后者表明数据库处于一致状态。

一个连接建立之后,它就处于''事务已提交''状态,因为此时用户对数据库没有做任何更改操作,所以数据库仍旧处于一致状态。如果在连接中执行一条可执行的SQL语句并且该连接还没有启动一个事务,那么系统将自动地启动一个事务。当然,用户也可以在连接上之后(此时处于''事务已提交''状态)马上手动启动一个事务或者在上一次事务结束之后(此时处于''事务已提交''状态)手动启动一个事务。程序中接下来的操作都将作为该事务的一部分直到该连接断开或该事务结束。因此,事务不能嵌套。在一个事务已经完成之后(连接处于''事务已提交''状态),执行任何一条可执行的SQL语句,则系统自动开始另一个事务。

一个事务可由COMMIT语句或者ROLLBACK语句结束。当执行ROLLBACK命令时,该事务对数据库所做的所有修改都将被取消;COMMIT命令则确认这些修改,把它们永久地写到数据库中去。一个事务也可以在程序结束时由系统终止,并且该事务的所有操作都将被回滚。

在连接处于''事务未提交''状态时,不能启动事务,因为此时连接仍然处于上一个事务中。在连接处于''事务已提交''状态时,不能提交事务,因为此时连接不处于任何事务中。

事务结束时,系统自动关闭所有打开的游标。

注解

''事务已提交''状态指的是数据库处于一致状态,所以用户调用 COMMIT 和 ROLLBACK 都能达到''事务已提交''状态。