蔡义忠,熊发涯
(黄冈职业技术学院,湖北黄冈 438002)
笔者在开发一个“说课比赛网络评分系统”的时候,遇到一个需要对多个数据库表同时操作的情况,如果用普通的做法,顺序对各个数据库表进行操作,就可能会在极端情况下,出现操作一部分的数据库表的情况下操作被中断。这样导致数据库中的信息出现不一致,甚至出现“脏数据”。从而影响软件系统的稳定运行。如果使用事务来处理对多个数据库表的操作就可以避免这样极端情况下的错误产生。
事务是对数据库执行的一个操作单位。它是以逻辑顺序完成的工作单元或工作序列,无论是用户手工操作,还是由程序进行的自动操作。
一个事务可以是一个或多个DML语句。在管理事务时,任何指定的事务都必须作为一个整体来完成,否则其中任何一条语句都不会完成[1]。下面是事务的基本特征:
1)所有的事务都有开始和结束。例如,在SQL Server中事务用BEGIN TRANSACTION开始。
2)事务可以被保存或撤消。例如,在SQL Server中撤消事务的方法用ROLLBACK TRANSACTION。提交事务用COMMIT TRANSACTION。通常撤消或保存事务是放在一个条件判断语句中来执行的。
3)如果事务在中途失败,事务中的任何部分都不会被记录到数据库中。这样可以很好的保证数据的完整性。
注意:事务控制命令只与DML命令INSERT、UPDATE和DELETE配合使用,比如我们不会创建表之后使用COMMIT语句,因为当表被创建之后,它会自动被提交给数据库。类似地,不能使用ROLLBACK语句来恢复被撤消的表。
当事务完成之后,事务信息被保存在数据库里的指定区域或临时回退区域。所有的修改都被保存到这个临时回退区域。直到事务控制命令出现。当事务控制命令出现时,所做的修改要么被保存到数据库中,要么被放弃,然后临时回退区域被清空。
下面,笔者以具体的应用实例来进一步解释事务的使用方法。在笔者最近开发的“说课比赛网络评分系统”中有这么一个业务需求。要求一个院校最多只能报4门课程参加湖北省高职高专院校说课比赛。那么,在数据库系统中,增加一个院校表信息的同时,就得在用户表和课程表中同时增加四条记录信息。并且一个新增的参赛教师信息对应一个新增的参赛课程信息。这个功能对应的界面如图1所示。
图1 通过事务增加院校的界面
这个功能需求,用存储过程及事务来实现,具体代码如下:
注意:SQL Server的注释是用“--”开头,读者可以通过看注释来理解事务的实现方法。
事务处理在数据库应用中极为重要,是保证数据库应用系统安全稳定运行的重要手段。本文中的小案例中的判断事务执行的成功还是失败是通过记录每个操作语句执行后返回的系统错误号@@ERROR来判断,只要有一次出现@@ERROR返回值不是0,则最终的@ERROR变量就不能为0,也就可以判断事务是否失败。注意区别,@ERROR是定义的变量,@@ERROR是系统返回的错误编号,执行正常时@@ERROR返回为0,执行不正常@@ERROR返回为非0。
[1]什么是SQL中的事务以及控制事务概述[EB/OL].http://www.gootry.com/java-base/article/100612222328/153,2010-06-12.
[2]高文.面向素质教育、基于信息技术的课程与教学改革[J]. 上海教育,2001,(4).
[3]赖一飞,魏敏杰.面向新世纪的统计学教学改革[J].科技进步与对策,2001,(6).