一、事务概念
事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的。这特别适用于多用户同时操作的数据通信系统。例如:订票、银行、保险公司以及证券交易系统等。
二、事务属性
事务4大属性:
1 原子性(Atomicity):事务是一个完整的操作。
2 一致性(Consistency):当事务完成时,数据必须处于一致状态。
3 隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的。
4 持久性(Durability):事务完成后,它对于系统的影响是永久性的。
三、创建事务
T-SQL中管理事务的语句:
1 开始事务: begin transaction
2 提交事务:commit transaction
3 回滚事务: rollback transaction
事务分类:
1 显式事务:用begin transaction明确指定事务的开始。
2 隐性事务:打开隐性事务:set implicit_transactions on,当以隐性事务模式操作时,SQL Servler将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需要提交或回滚事务。
3 自动提交事务:SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务。如果成功执行,则自动提交,否则回滚。
事务日志 (SQL Server)
每个 SQL Server 数据库都有事务日志,用于记录所有事务以及每个事务所做的数据库修改。
如果系统出现故障,你将需要依靠该日志将数据库恢复到一致的状态。
重要
永远不要删除或移动此日志,除非你完全了解执行此操作的后果。
提示
数据库检查点 (SQL Server)。
事务日志支持的操作
事务日志支持以下操作:
-
恢复个别的事务。
-
SQL Server 启动时恢复所有未完成的事务。
-
将还原的数据库、文件、文件组或页前滚至故障点。
-
支持事务复制。
-
AlwaysOn 可用性组、数据库镜像和日志传送。
恢复个别的事务
如果应用程序发出 ROLLBACK 语句,或者数据库引擎检测到错误(例如失去与客户端的通信),使用日志记录回退未完成的事务所做的修改。
SQL Server 启动时恢复所有未完成的事务
在事务日志中找到的每个未完成的事务都将回滚,以确保数据库的完整性。
将还原的数据库、文件、文件组或页前滚至故障点
先还原上次完整数据库备份和上次差异数据库备份,然后将后续的事务日志备份序列还原到故障点。
最后的日志备份还原后,数据库引擎将使用日志信息回退到该点上未完成的所有事务。
支持事务复制
事务复制的工作原理。
支持高可用性和灾难恢复解决方案
备用服务器解决方案、AlwaysOn 可用性组、数据库镜像和日志传送极大程度上依赖于事务日志。
AlwaysOn 故障转移群集实例
关于日志传送。
数据库镜像。
Transaction Log characteristics
SQL Server 数据库引擎 事务日志的特征:
- 事务日志物理体系结构。
- 日志记录和页的格式不必遵守数据页的格式。
- ALTER DATABASE (Transact-SQL)。
- 重用日志文件中空间的机制速度快且对事务吞吐量影响最小。
事务日志截断
某些操作可以最小日志量进行记录以减少其对事务日志大小的影响。
如果事务日志从不截断,它最终将填满分配给物理日志文件的所有磁盘空间。
为了避免空间不足,除非由于某些原因延迟日志截断,否则将在以下事件后自动进行截断:
-
简单恢复模式下,在检查点之后发生。
-
在完整恢复模式或大容量日志恢复模式下,如果自上一次备份后生成检查点,则在日志备份后进行截断(除非是仅复制日志备份)。
可能延迟日志截断的因素。
备注
Manage the Size of the Transaction Log File。
Factors that can delay log truncation
在日志记录长时间处于活动状态时,事务日志截断将延迟,事务日志可能填满,这一点我们在本主题(很长)前面提到过。
解决事务日志已满的问题(SQL Server 错误 9002)。
下表对这些列的值进行了说明。
| log_reuse_wait 值 | log_reuse_wait_desc 值 | 说明 |
|---|---|---|
| 0 | NOTHING | 当前有一个或多个可重复使用的虚拟日志文件。 |
| 1 | CHECKPOINT | 数据库检查点 (SQL Server)。 |
| 2 | LOG_BACKUP | 完成下一个日志备份后,一些日志空间可能变为可重复使用。 |
| 3 | ACTIVE_BACKUP_OR_RESTORE | 如果数据备份阻止了日志截断,则取消备份操作可能有助于解决备份直接导致的此问题。 |
| 4 | ACTIVE_TRANSACTION | 然后就会填充 tempdb 事务日志。 |
| 5 | DATABASE_MIRRORING | 数据库镜像 (SQL Server)。 |
| 6 | REPLICATION | SQL Server Replication。 |
| 7 | DATABASE_SNAPSHOT_CREATION | 这是日志截断延迟的常见原因,通常也是主要原因。 |
| 8 | LOG_SCAN | 这是日志截断延迟的常见原因,通常也是主要原因。 |
| 9 | AVAILABILITY_REPLICA | AlwaysOn 可用性组概述 (SQL Server)。 |
| 10 | — | 仅供内部使用 |
| 11 | — | 仅供内部使用 |
| 12 | — | 仅供内部使用 |
| 13 | OLDEST_PAGE | 数据库检查点 (SQL Server)。 |
| 14 | OTHER_TRANSIENT | 当前未使用此值。 |
可尽量减少日志量的操作
恢复模式下(以及简单恢复模式下)按最小方式记录、但在运行备份时例外的操作。
备注
内存优化表不支持最小日志记录。
备注
不过,如果在最小日志记录生效时数据库损坏或丢失,则无法将数据库恢复到故障点。
下列操作在完整恢复模式下执行完整日志记录,而在简单和大容量日志恢复模式下按最小方式记录日志:
- Prerequisites for Minimal Logging in Bulk Import。
启用事务复制时,将完全记录 BULK INSERT 操作,即使处于大容量日志恢复模式下。
- INTO 操作。
启用事务复制时,将完全记录 SELECT INTO 操作,即使处于大容量日志恢复模式下。
-
数据类型 (Transact-SQL)。
-
注意,在更新现有值时没有使用最小日志记录。
重要
不推荐使用 WRITETEXT 语句和 UPDATETEXT 语句,应该避免在新的应用程序中使用这些语句。
-
按最小方式记录的索引操作如下:
-
CREATE INDEX 操作(包括索引视图)。
-
ALTER INDEX REBUILD 或 DBCC DBREINDEX 操作。
重要
不推荐使用“DBCC DBREINDEX 语句”;请不要在新的应用程序中使用该语句。
-
DROP INDEX 操作期间将 始终 完整记录索引页的释放操作。)
-