事务是关系型数据库系统不可缺少的一部分,它们用来帮助定义一个工作单元。这样的工作单元能包含一个或多个T-SQL语句,它们以一个整体进行提交或者回滚。这样的“全有全无一功能能防止部分更新或者数据状态不一致。所谓部分更新,是指当一个相关进程只有一部分被回滚或者取消,而其他部分没有回滚或回退时产生的情情况。
每个事务都具有ACID校验口ACID表示原了性(Atomicity)、一致性(Consistcncy)、隔离性(lsolation)[或者独立性(lndependcnce)]和持久性( Durability)。
- 原子性意味着事务是一个全有全无的实体——要么完成所有步骤要么什么都没有发生。
- 一致性确保数据在事务前和事务后都是有效的,必须保持数据完整(例如外键引用)以及内部数据结构处于一个有效的状态。
- 隔离性是事务不依赖其他并发事务(即使在同一时间或者重叠发生)的必要条件。一个事务不能看到其他处于中间状态的事务的数据,但能看到事务开始前或结束后的数据。
- 持久性意味着事务提交后事务的效果是永久的,即使系统发生故障修改也会生效。
自动提交( autocommit)是SQL Scrver默认的行为,每一个独立的T-SQL语句都会在执行完毕后自动提交。例如,如果你有两个INSERT语句,第一个失败了而第二个成功了,第二个的修改还是有效,因为每一个INSERT自动包含在自己的事务中。尽管这种模式能让开发者无需操心显式实现事务,但是对事务性的活动采用这种模式是会产生错误的。例如,你有两个事务,一个为账户还款,而另一个贷款,但是第一个事务失败了,这样你只是贷款而没有还款。遇到这种情况银行可能高兴了,但对于客户来说却未必,账户上莫明其妙多了贷款。自动提交对于特殊的管理变动有点儿危险——例如,如果你不小心删除了表中的所有行,在意识到错误后没有机会回滚事务。
当下列语句中的一个首先执行的时候.SQL Server会话将自动打开一个新事物,此时隐式(implicit)事务将被启用:ALTER TABLE. FETCH, REVOKE. CREATE、GRANT、SELECT, DELETE、INSERT、TRUNCATE TABLE、DROP、OPEN和UPDATE。
只要上述任意语句被执行就会自动创建(或打开)一个新的事务,并且该事务会一直保持打开状态,直到遇到ROLLBACK或COMMIT语句。初始化命令已经包含在打开事务的过程中了。在查询会话中执行下面的命令能激活隐式模式:
SELECT IMPLICIT_TRANSACTIONS ON
要关闭它(回到显式模式)则执行:
SELECT IMPLICIT_TRANSACTIONS OFF
隐式模式在正式的应用中会很麻烦,因为应用程序设计师和最终用户可能会忘记提交事务,让它们处于打开的状态,这会阻塞其他连接(本章后面会详细介绍阻塞)。
显式( explicit)事务是由你自己定义的口当对数据库应用程序进行数据修改操作的时候,显式事务是操作最推荐的模式。这是因为你要显式控制哪些修改属于一个事务以及有错误发生的时候执行什么操作。那些需要分在一组中的修改操作按照你自己的意愿来实现。
显式事务使用下面的T-SQL命令和关键字,如表所示
显式事务命令
BEGIN TRANSACTION | 设置一个显式事务的起点 |
ROLLBACK TRANSACTION | 恢复由一个事务修改的原始数据,使数据回到事务开始时的状态。释放由事务占据的资源 |
COMMIT TRANSACTION | 如果没有遇到错误则结束事务并且永久实现修改。释放由事务占据的资源 |
BEGIN DISTRIBUTED TRANSACTION | 允许我们定义一个由微软分布式事务处理协调器(MS DTC)管理的分布式事务的起点。MS DTC必须在本地并且远程运行 |
SAVE TRANSACTION | SAVE TRANSACTION在事务内部设置一个保存点,允许我们定义一个事务在部分取消后能返回的位置。事务回滚到保存点后必须立即回滚或提交。 |
@@TRANCOUNT | 返回连接的活动事务数量。BEGIN TRANSACTION把@@TRANCOUNT加1,而ROLLBACK TRANSACTION和COMMIT TRNASACTION把@@TRANCOUNT减l。ROLLBACK TRANSACTION到保存点不会影响@@TTRANCOUNT |