所谓事务(Transaction ),是指一个操作序列,这些操作序列要么都被执行,要么都不被执行,它是一个不可分割的工作单元。
二.事务的特点
在多用户DBMS中,“事务”是个十分重要的概念。它是保持数据一致性及可恢复性的基本工作单位。事务的主要特点是:
一致性:它保证并发用户读取数据的一致性。
隔离性:事务内部的操作及使用的数据对并发的其他事务是隔离的。
可恢复性:DBMS利用事务日志能对事务进行自动恢复。
三.事务的管理
在SQL Server中,对事务的管理包含三个方面:
事务控制语句:控制事务执行的语句。包括将一系列操作定义为一个工作单元来处理。
锁机制:封锁正被一个事务修改的数据,防止其他用户访问到“不一致”的数据。
事务日志:使事务具有可恢复性。
为了尽可能避免死锁的出现,应注意:
1、在所有的事务中都按同一顺序来访问各个表。尽可能利用存储过程来完成一个事务,以保证对各表的访问次序都是一致的。
2、事务应该尽量小且应尽快提交。
3、避免人工输入操作出现在事务中。
4、避免并发地执行许多像INSERT、UPDATE、DELETE这类数据修改语句
四.事务控制语句
在SQL Server中,对事务的管理是通过事务控制语句和几个全局变量结合起来实现的,具体语语句如下:
SAVE TRAN:后跟保存点名,表示设置保存点
BEGIN TRAN [tran_name]:标识一个用户定义的事务的开始。tran_name为事务的名字,标识一个事务开始。
COMMIT TRAN [tran_name]:表示提交事务中的一切操作,结束一个用户定义的事务。使得对数据库的改变生效。
ROLLBACK TRAN [tran_name|save_name]:回退一个事务到事务的开头或一个保存点。表示要撤消该事务已做的操作,回滚到事务开始前或保存点前的状态。
SAVE TRAN save_name:在事务中设置一个保存点。它可以使一个事务内的部分操作回退。
COMMIT TRAN
/ *提交A组语句,且若未回退B组语句则提交B组语句* /
在事务中不能包含的语句
注意,事务中不能包含如下语句:
CREATE DATABASE
ALTER DATABASE
BACKUP LOG
DROP DATABASE
RECONFIGURE
RESTORE DATABASE
RESTORE LOG
UPDATE STATISTICS
五.事务使用示例
事务管理对维护数据库数据的一致性具有非常重要意义。下面,我们针对本书教学数据库,举一个事务处理的简单例子。要求将course数据表中“C语言”课程的学分减去2分,加到“数据库原理”这门课上(使总的学分数不变)。
程序代码如下:
USE teachdb
GO
DECLARE @num int
BEGIN TRANSACTION
UPDATE course SET c_score=c_score-2 WHERE c_name='C语言'
SET @num=@@ROWCOUNT
IF @num=0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
UPDATE course SET c_score=c_score+2 WHERE c_name='数据库应用'
/* 这里我们故意将“数据库原理”写作“数据库应用”,使修改不能完成。*/
SET @num=@@ROWCOUNT
IF @num=0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
COMMIT TRANSACTION
程序运行结果如下图所示。由于我们将“数据库原理”改成“数据库应用”,而course表中无“数据库应用”对应的记录,所以,操作不成功。当我们通过查询分析器中的“对象浏览器”打开course表查看其中的数据,可知“C语言”和“数据库原理”这两门课的学分没有改变(事实上“C语言”课的学分变化后被回滚取消了)。
![]()
