数据库事务简单介绍 (SqlServer)
前言:摘抄至 Sql server从入门到精通 密码:yskt
一、事务的概念
事务是由一系列语句构成的逻辑工作单元。事务和存储过程等批处理有一定程度上的相似之处,通常都是为了完成一定业务逻辑而将一条或者多条语句“封装”起来,使它们与其他语句之间出现个逻辑上的边界,并形成相对独立的一个工作单元。
当使用事务修改多个数据表时,如果在处理的过程中出现了某种错误,如系统死机或突然断电等情况,则返回结果是数据全部没有被保存。因为事务处理的结果只有两种:一种是在事务处理的过程中,如果发生了某种错误则整个事务全部回滚,使所有对数据的修改全部撤销,事务对数据库的操作是单步执行的,当遇到错误时可以随时回滚;另一种是如果没有发生任何错误且每一步的执行都成功则整个事务全部被提交。从而可以看出,有效地使用事务不但可以提高数据的安全性,而且还可以增强数据的处理效率。
事务包含4种重要的属性,统称为ACID(原子性、一致性、隔离性和持久性),一个事务必须通过ACID
- 原子性( Atomic)
事务是一个整体的工作单元,事务对数据库所作的操作要么全部执行,要么全部取消。如果某条语句执行失败,则所有语句全部回滚。
- 一致性( ConDemoltent)
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。如果事务成功,则所有数据将变为一个新的状态;如果事务失败,则所有数据将处于开始之前的状态。
- 隔离性( Isolated)
由某一事务所作的修改必须与其他事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据
- 持久性( Durability)
当事务提交后,对数据库所作的修改就会永久保存下来
二、显示事务和隐式事务
事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据修改均被清除。
SQL Server以下列事务模式运行:
- 自动提交事务:每条单独的语句都是一个事务。
- 显式事务:每个事务均以 BEGIN TRANSACTION语句显式开始,以 COMMIT或 ROLLBACK语句显式结束。
- 隐式事务:在前一个事务完成时新事务隐式启动,但每个事务仍以 COMMIT或 ROLLBACK语句显式完成。
- 批处理级事务:只能应用于多个活动结果集(MARS),在MARS会话中启动的 Transact-SQL显式或隐式事务变为批处理级事务。当批处理完成时没有提交或回滚的批处理级事务自动由SQL Server进行回滚主要介绍显式事务和隐式事务。
1.显式事务
显式事务是用户自定义或用户指定的事务。可以通过 BEGIN TRANSACTION, COMMIT TRANSACTION COMMIT WORK、 ROLLBACK TRANSACTION或 ROLLBACK WORK事务处理语句定义显式事务。
2.隐式事务
隐式事务需要使用 SET IMPLICIT TRANSACTIONS ON语句将隐式事务模式设置为打开。在打开了隐式事务的设置开关时,执行下一条语句时自动启动一个新事务,并且每关闭一个事务时,执行下条语句又会启动一个新事务,直到关闭了隐式事务的设置开关。
SQL Server的任何数据修改语句都是隐式事务,例如, ALTER TABLE、 CREATE、 DELETE、DROP FETCH、 GRANT、 INSERT、OPEN、 REVOKE、 SELECT、 TRUNCATE TABLE、 UPDATE。这些语句都可以作为一个隐式事务的开始。如果要结束隐式事务,需要使用 COMMIT TRANSACTION或 ROLLBACK TRANSACTION语句来结束事务。
3.事务的COMMIT和 ROLLBACK
结束事务包括“成功时提交事务”和“失败时回滚事务”两种情况,在 Transact-SQL中可以使用以下两种结束事务。
- COMMIT提交事务,用在事务执行成功的情况下。 COMMIT语句保证事务的所有修改都被保存,同时 COMMIT语句也释放事务中使用的资源,如事务使用的锁
- ROLLBACK回滚事务,用于事务在执行失败的情况下,将显式事务或隐式事务回滚到事务的起点或事务内的某个保存点。
三、事务的工作机制
- 当在代码中出现 BEGIN TRANSACTION语句时,SQL Server将会显示事务,并会给新事务分配一个事务ID。
- 当事务开始后, SQL Server将会运行事务体语句,并将事务体语句记录到事务日志中。
- 在内存中执行事务日志中所记录的事务体语句。
- 当执行到 COMMIT语句时会结束事务,同时事务日志也会被写到数据库的日志设备上,从而保证日志可以被恢复。
四、事务的并发问题
事务的并发问题主要体现在丢失或覆盖更新、未确认的相关性(脏读)、不一致的分析(不可重复读)和幻象读4个方面,这些是影响事务完整性的主要因素。如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生以上几种问题。下面将一一说明。
- 丢失更新
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其他事务的存在。最后的更新将重写由其他事务所作的更新,这样就会导致数据丢失。
- 未确认的相关性(脏读)
如果一个事务读取了另外一个事务尚未提交的更新,则称为脏读。
- 不一致的分析(不可重复读)
当事务多次访问同一行数据,并且每次读取的数据不同时,将会发生不一致分析问题。不一致的分析与未确认的相关性类似,因为其他事务也正在更改该数据。然而,在不一致的分析中,事务所读取的数据是由进行了更改的事务提交的。而且,不一致的分析涉及多次读取同一行,并且每次信息都由其他事务更改,因而该行被不可重复读取。
- 幻象读
幻象读和不一致的分析有些相似,当一个事务的更新结果影响到另一个事务时,将会发生幻象读问题。事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其他事务删除。同样,由于其他事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。
五、事务的隔离级别
当事务接受不一致的数据级别时被称为事务的隔离级别。如果事务的隔离级别比较低,会增加事务的并发问题,有效设置事务的隔离级别可以降低并发问题的发生设置隔离数据可以使一个进程使用,同时还可以防止其他进程的干扰。设置隔离级别定义了SQL Server会话中所有 SELECT语句的默认锁定行为,当锁定用作并发控制机制时,它可以解决并发问题这使所有事务得以在彼此完全隔离的环境中运行,但是任何时候都可以有多个正在运行的事务。
在 SQL Server中,可以使用 SET TRANSACTION ISOLATION LEVEL语句来设置事务的隔离级别。