10.1 事务
10.1.1 事务的特性
当事务处理系统(例如,SQL Server 数据库引擎)创建事务时,将确保事务有某些特性。组件的开发者们假设事务的特性应该是一些不需要他们亲自管理的特性。这些特性称为 ACID 特性,即:原子性(Atomicity )、一致性( Consistency )、隔离性( Isolation)和持久性(Durabilily)。
(1) 原子性
原子性属性用于标识事务是否完全地完成,一个事务的任何更新要在系统上完全完成,如果由于某种原因出错,事务不能完成它的全部任务,系统将返回到事务开始前的状态。
(2) 一致性
事务在系统完整性中实施一致性,这通过保证系统的任何事务最后都处于有效状态来实现。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。因为事务开始时系统处于一致状态,所以现在系统仍然处于一致状态。
(3) 隔离性
在隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。
这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
重要的是,在隔离状态执行事务,系统的状态有可能是不一致的,在结束事务前,应确保系统处于一致状态。但是在每个单独的事务中,系统的状态可能会发生变化。如果事务不是在隔离状态运行,它就可能从系统中访问数据,而系统可能处于不一致状态。通过提供事务隔离,可以阻止这类事件的发生。
(4) 持久性
持久性意味着一旦事务执行成功,在系统中产生的所有变化将是永久的。应该存在一些检查点防止在系统失败时丢失信息。甚至硬件本身失败,系统的状态仍能通过在日志中记录事务完成的任务进行重建。持久性的概念允许开发者认为不管系统以后发生了什么变化,完成的事务是系统永久的部分。
10.1.2 SQL Server中的事务处理机制
SQL Server 数据库引擎将通过以下处理机制实现事务的 ACID 特性。
(1) 原子性
如果在提交事务的过程中出现错误,整个事务将会回滚。只有当事务中的所有部分都成功执行了,才将事务写入磁盘并使变化永久化。
为了提供回滚或者撤消未提交的变化的能力,SQL Server使用一个预写事务日志(WAL),在将数据提交到实际数据页面之前,先写在事务日志上。事务回滚时,数据源可以撤消所有未提交的改变。
(2) 一致性
在事务提交之前,数据页面处于有效状态。如果事务成功地完成,并且提交事务,则数据页面处于新的有效的状态。如果事务出错,终止后,数据页面返回到原先的有效状态。
当许多用户同时使用和修改同样的数据时,事务必须保持其数据的完整性和一致性。因此使用下一个特性:隔离性。
(3) 隔离性
隔离性不仅仅保证多个事务不能同时修改相同数据,而且能够保证事务操作产生的变化直到变化被提交或终止时才能对另一个事务可见,并发的事务彼此之间毫无影响。这就意味着所有要求修改或读取的数据已经被锁定在事务中,直到事务完成才能释放。SQL Server通过使用锁定来实现隔离,事务中涉及的各个数据项或数据集使用锁定来防止并发访问。
(4) 持久性
事务导致的数据变化的是永久的,一直保持在系统中,只是在事务完全完成并提交后才写入磁盘的。SQL Server可以通过读取事务日志来验证所有数据都被写入数据页面。
提示:
事务的一致性与数据完整性是不同的概念。SQL Sever的事务处理机制,可以保证数据在提交后即使遇到回滚也可以回到最初的原始状态。
而数据完整性是由数据库引擎保证数据是正确、有效的,防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出而造成无效操作或错误信息。
10.1.3 事务的运行模式
事务是单个工作单元。 如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分。 如果事务遇到错误且必须取消或回滚,则所有数据修改均被清除。
SQL Server 以下列事务模式运行。
(1) 自动提交事务
每条单独的语句都是一个事务。例如,使用DDL(数据定义语言)定义一个对象。
(2) 显式事务
每个事务均以 BEGIN TRANSACTION 语句显式开始,以 COMMIT 或 ROLLBACK 语句显式结束。
以下的示例将命名一个名为 CandidateDelete 的事务,并标记这个事务,最后提交这个事务。
BEGIN TRANSACTION CandidateDelete WITH MARK N'Deleting a Job Candidate'; GO USE AdventureWorks2014; GO DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 13; GO COMMIT TRANSACTION CandidateDelete; GO |
(3) 隐式事务
在前一个事务完成时新事务隐式启动,但每个事务仍以 COMMIT 或 ROLLBACK 语句显式完成。
(4) 批处理级事务
只能应用于多个活动结果集 (MARS),在 MARS 会话中启动的 Transact-SQL 显式或隐式事务变为批处理级事务。 当批处理完成时没有提交或回滚的批处理级事务自动由 SQL Server 进行回滚。