活动事务日志以及事务的类型

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
日志服务 SLS,月写入数据量 50GB 1个月
简介:

活动事务日志

所谓活动事务日志,就是所有没有提交的事务所产生的日志记录,以及在它们之后的所有日志记录。

如果一个事务还没有提交,那它可以在任何时候回滚。SQL Server必须做好这种准备,以便能够从日志记录中找回修改前的数据内容,完成回滚。在SQL Server里面,所有的日志记录都有严格顺序,中间不可以有任何跳跃。所以如果某个数据库有没有提交的事务,SQL Server会标记所有从这个事务开始的日志记录(不管和这个事务有没有关系)为活动事务日志 。这些日志记录都有可能“需要”被用来做回滚。

事务的提交与回滚

事务在提交前,所有的操作都是在虚拟的环境中进行的,事务提交时才将事务进行的所有修改更新到数据库的存储介质上,如硬盘。在事务提交前,如果有操作失败的情况,那么需要进行回滚操作,便可以取消事务所进行的修改,当事务被提交后,再执行回滚是无效的。

实验

复制代码
--实验1----------事务回滚-------------
--检查最老的活动事务
DBCC OPENTRAN
use TESTDB1
--开始事务
begin tran
--插入一条数据
INSERT INTO test VALUES ('4', 'bbb');
--查询这个插入语句的事务,可以查到
DBCC OPENTRAN
--查询表,发现存在插入结果。
select * from test;
--回滚事务
rollback;
--再次检查最老的活动事务,发现没有事务了
DBCC OPENTRAN
--再次查询发现找不到刚才插入的数据了。
select * from test;


--实验2-------------事务提交后回滚------------
--检查最老的活动事务
DBCC OPENTRAN
use TESTDB1
--开始事务
begin tran
--插入一条数据
INSERT INTO test VALUES ('adfs', 'ddfs');
--查询这个插入语句的事务,可以查到
DBCC OPENTRAN
--查询表,发现存在插入结果。
select * from test;
--提交事务
commit
--再次检查最老的活动事务,发现没有事务了
DBCC OPENTRAN
--回滚事务,报错:The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.
--证明:已提交事务无法回滚。
rollback;
复制代码

事务的分类

一类是Explicit Transactions,另外一类是Implicit Transactions。

Explicit Transactions(显式事务)

所谓的Explicit Transactions,就是我们需要在TSQL中显式定义的事务,由BEGIN TRANSACTION开头,由COMMIT TRANSACTION或者是ROLLBACK TRANSACTION结尾的事务。

Implicit Transactions(隐式事务)

Implicit Transactions是不需要声明事务的开始与结束,每一条语句本身就是一个事务,这样定义语句有:

ALTER TABLE

INSERT

CREATE

OPEN

DELETE

REVOKE

DROP

SELECT

FETCH

TRUNCATE TABLE

GRANT

UPDATE

INSERT INTO test VALUES ('bbbb', 'bbbb');--无法被回滚
rollback;--The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.

Autocommit Mode

这是SQL Server的默认事务提交模式,在这种模式下,所有的TSQL语句都会在其执行完的时候,执行成功的被提交,执行失败的被回滚。

常见的错误有三种,不同的错误有不同的提交回滚方式:

  1. 编译错误:编译错误主要就是语法错误。例如,在一个事务中,你又有一条语句中某一个关键字写错了,比如你将values达成了valuse,那么整个事务中的所有语句都不会被执行,相当于全部被回滚。
  2. 主键冲突:如果存在主键冲突的话,那么那些冲突的语句会被回滚,也就是插入失败,但是之前或者之后不冲突的语句插入成功,不会被回滚。
  3. 表不存在错误:假如一条插入语句的表名写错了,那么只回滚错误的那条语句,以及在错误语句之后的所有语句,这个跟前面的主键冲突有区别,前面主键冲突只回滚冲突语句,不影响后面的语句,而表不存在错误会影响错误语句后面的语句。

举例实例如下面三个例子所示:

复制代码
-- compile error
-- 编译 错误,那么下面的三条插入语句一条都不执行,虽然看上去好像是回滚了。
USE AdventureWorks2008R2;
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBatch VALUSE (3, 'ccc');  -- Syntax error. VALUES打错了。
GO
SELECT * FROM TestBatch;  -- Returns no rows.
GO

-- run-time error.
-- 主键冲突错误,
-- 会回滚错误的语句,执行正确的语句
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBatch VALUES (1, 'ccc');  -- Duplicate key error.
GO
SELECT * FROM TestBatch;  -- Returns rows 1 and 2.
GO

-- 表不存在错误。
GO
INSERT INTO TestBatch VALUES (3, 'aaa');
INSERT INTO TestBatch VALUES (4, 'bbb');
INSERT INTO TestBch VALUES (5, 'ccc');  -- Table name error.
GO
SELECT * FROM TestBatch;  -- Returns rows 1 and 2.
GO
复制代码

 

 本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2012/07/12/2588629.html,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4月前
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
|
2月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1712 14
|
3月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
180 0
|
4月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
217 0
|
4月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
131 0
|
4月前
|
存储 关系型数据库 MySQL
深入MySQL:事务日志redo log详解与实践
【8月更文挑战第24天】在MySQL的InnoDB存储引擎中,为确保事务的持久性和数据一致性,采用了redo log(重做日志)机制。redo log记录了所有数据修改,在系统崩溃后可通过它恢复未完成的事务。它由内存中的redo log buffer和磁盘上的redo log file组成。事务修改先写入buffer,再异步刷新至磁盘,最后提交事务。若系统崩溃,InnoDB通过redo log重放已提交事务并利用undo log回滚未提交事务,确保数据完整。理解redo log工作流程有助于优化数据库性能和确保数据安全。
682 0
|
4月前
|
存储 SQL 关系型数据库
MySQL事务日志奥秘:undo log大揭秘,一文让你彻底解锁!
【8月更文挑战第24天】本文深入探讨了MySQL中undo log的关键作用及其在确保事务原子性和一致性方面的机制。MySQL通过记录事务前的数据状态,在需要时能回滚至初始状态。主要介绍InnoDB存储引擎下的undo log实现,包括undo segment和record的结构,而MyISAM则采用redo log保障持久性而非一致性。通过一个简单的SQL回滚示例,展示了undo log如何在实际操作中发挥作用,帮助读者更好地理解并运用MySQL事务管理功能。
411 0
|
5月前
|
SQL 存储 数据库
MySQL设计规约问题之如何处理日志类型的表
MySQL设计规约问题之如何处理日志类型的表
TS定义布尔值,let flag:boolean = true,定义数字类型 let a1:number = 10,赋值 let str1:string = ‘‘,打印c~.log($(str1))
TS定义布尔值,let flag:boolean = true,定义数字类型 let a1:number = 10,赋值 let str1:string = ‘‘,打印c~.log($(str1))
|
6月前
|
存储 关系型数据库 MySQL
第14章_MySQL事务日志(2)
第14章_MySQL事务日志
38 0