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

活动事务日志

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

如果一个事务还没有提交,那它可以在任何时候回滚。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,如需转载请自行联系原作者

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/347336

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。