`

sql server事务全攻略

阅读更多

sql server事务全攻略

发布于:2007-2-20 17:21:38来源:不详阅读次数:本日:1 本周:14 本月:28 总数:237 TAG列表:暂时还没有tag
一 事务的属性
事务具有ACID属性
即 Atomic原子性, Consistent一致性, Isolated隔离性, Durable永久性
原子性
就是事务应作为一个工作单元,事务处理完成,所有的工作要么都在数据库中保存下来,要么完全
回滚,全部不保留
一致性
事务完成或者撤销后,都应该处于一致的状态
隔离性
多个事务同时进行,它们之间应该互不干扰.应该防止一个事务处理其他事务也要修改的数据时,
不合理的存取和不完整的读取数据
永久性
事务提交以后,所做的工作就被永久的保存下来
二 事务并发处理会产生的问题
丢失更新
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题、
每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。
脏读
当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。
第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。
不可重复读
当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。
不一致的分析与未确认的相关性类似,因为其它事务也是正在更改第二个事务正在读取的数据。
然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取。
幻像读
当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻像读问题。
事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其它事务删除。同样,由于其它事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。
三 事务处理类型
自动处理事务
系统默认每个T-SQL命令都是事务处理 由系统自动开始并提交
隐式事务
当有大量的DDL 和DML命令执行时会自动开始,并一直保持到用户明确提交为止,切换隐式事务可以用SET IMPLICIT_TRANSACTIONS
为连接设置隐性事务模式.当设置为 ON 时,SET IMPLICIT_TRANSACTIONS 将连接设置为隐性事务模式。当设置为 OFF 时,则使连接返回到自动提交事务模式
用户定义事务
由用户来控制事务的开始和结束 命令有: begin tran commit tran rollback tran 命令
分布式事务
跨越多个服务器的事务称为分布式事务,sql server 可以由DTc microsoft distributed transaction coordinator
来支持处理分布式事务,可以使用 BEgin distributed transaction 命令启动一个分布式事务处理
四 事务处理的隔离级别
使用SET TRANSACTION ISOLATION LEVEL来控制由连接发出的所有语句的默认事务锁定行为
从低到高依次是
READ UNCOMMITTED
执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。
举例
设table1(A,B,C)
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
新建两个连接
在第一个连接中执行以下语句
select * from table1
begin tran
update table1 set c='c'
select * from table1
waitfor delay '00:00:10' --等待10秒
rollback tran
select * from table1
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
print '脏读'
select * from table1
if @@rowcount>0
begin
waitfor delay '00:00:10'
print '不重复读'
select * from table1
end
第二个连接的结果
脏读
A B C
a1 b1 c
a2 b2 c
a3 b3 c
'不重复读'
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
READ COMMITTED
指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。
在第一个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '不重复读'
select * from table1
rollback tran
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
update table1 set c='c'
第一个连接的结果
初始
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
不重复读
A B C
a1 b1 c
a2 b2 c
a3 b3 c
REPEATABLE READ
锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。
在第一个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '幻像读'
select * from table1
rollback tran
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
insert table1 select 'a4','b4','c4'
第一个连接的结果
初始
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
幻像读
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
a4 b4 c4
SERIALIZABLE
在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
在第一个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '没有变化'
select * from table1
rollback tran
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
insert table1 select 'a4','b4','c4'
第一个连接的结果
初始
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
没有变化
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
五 事务处理嵌套的语法和对@@TRANCOUNT的影响
BEGIN TRAN @@TRANCOUNT+1
COMMIT TRAN @@TRANCOUNT-1
ROLLBACK TR
---------------------------------------------------------------
话说温故而知新
分享到:
评论

相关推荐

    sqlserver分布式事务攻略

    在SQL_SERVER中使用分布式事务全攻略(图解)

    MS-SQL Server杂志-事务全攻略

    ### MS-SQL Server杂志-事务全攻略 #### SQL Server 发展及特性 ##### SQL Server 发展历程 SQL Server 是微软公司推出的一款关系型数据库管理系统,自1989年发布以来,经历了多个版本的迭代升级。它最初由微软、...

    sql事务全攻略,用实例介绍事务应用

    本资料“sql事务全攻略”深入浅出地探讨了这一主题,旨在帮助读者理解并掌握事务的应用。 1. **事务的基本概念** 事务是一组数据库操作,这些操作被视为一个逻辑工作单元,必须全部成功或全部失败。如果其中任何...

    SQL攻略,很好的sql server学习资料,都是sql例题

    这份“SQL攻略”显然是一份专注于SQL Server的教程,通过各种例题帮助学习者掌握SQL的核心概念和实用技巧。 首先,我们要了解SQL的基本组成部分,包括DDL(Data Definition Language)用于定义数据结构,如CREATE ...

    SQL 21天自学全攻略

    《SQL 21天自学全攻略》是一本旨在帮助初学者快速掌握SQL语言的实用教程。SQL,全称Structured Query Language(结构化查询语言),是用于管理关系数据库系统的标准编程语言,广泛应用于Java、MySQL、Oracle和SQL ...

    Delphi 查询全攻略

    《Delphi查询全攻略》是一本专注于Delphi数据库应用开发的综合指南,旨在帮助开发者深入理解和熟练运用Delphi进行各种数据库操作。Delphi是Borland公司开发的一种强大的集成开发环境(IDE),以其高效的编译器和丰富...

    plsql全攻略.rar

    ### PL/SQL 全攻略知识点概述 #### 一、PL/SQL 概念与应用 **1.1 PL/SQL 定义** PL/SQL(Procedural Language for SQL)是一种专门为 Oracle 数据库设计的过程化语言,它结合了 SQL 的数据操作能力与传统过程化...

    ADO.Net全集完全攻略

    ADO.NET是微软开发的一种数据访问技术,用于与各种数据库进行交互,包括SQL Server、Oracle、MySQL等。它是.NET Framework的一部分,提供了高效、可靠且灵活的数据访问接口。在本全集完全攻略中,我们将深入探讨ADO...

    linux下mysql全攻略教程(开发15年工程师所写)

    命令行中执行`sudo apt install mysql-server`或`sudo yum install mysql-server`,然后完成配置和启动服务。 2. **初始化与配置**:安装完成后,需要对MySQL进行初始化,设置root用户的密码。执行`sudo mysql_...

    VC-ADO.rar_ADO_vc ado

    总的来说,"VC用ADO访问数据库全攻略"这份文档会是一个全面的学习资源,涵盖了从基本的数据库连接到复杂的数据操作,对于任何想要在VC++中使用ADO进行数据库编程的人来说,都是一个宝贵的参考资料。

    pb常用 函数--pb函数详解

    在PowerBuilder(PB)开发中,函数是构建...同时,理解如何与SQL Server安全规划相结合,以及如何在PB中处理Excel数据,如在《SQL Server安全规划全攻略》和《PB中批量处理Excel》中所讨论的,将有助于提升开发能力。

    VC.rar_doc_vc++数据库访问

    本文将详述如何使用ActiveX Data Objects(ADO)技术在VC++中进行数据库交互,结合提供的"VC用ADO访问数据库全攻略.doc"文档,我们可以深入理解这一过程。 ADO是Microsoft提出的一种数据访问接口,它允许开发者轻松...

    PowerBuilder完全教程.zip_PowerBuilder_PowerBuilder 教程_pb教程_powerbuil

    **PowerBuilder全攻略** PowerBuilder(简称PB)是一款强大的企业级应用开发工具,尤其在数据库应用程序的构建上表现卓越。本教程旨在为学习PB的人提供全面的指导,帮助初学者和有经验的开发者掌握其核心功能和高级...

    亮剑.NET深入体验与实战精要2

    3.3.1 页面数据绑定全攻略 131 3.3.2 Bind和Eval的区别 140 3.4 ASP.NET编程中的技巧 142 3.4.1 页面之间传值的7种方法 142 3.4.2 get与post方法的区别 146 3.4.3 ASP.NET服务器控件和 HTML控件的区别 146 3.4.4 ...

    亮剑.NET深入体验与实战精要3

    3.3.1 页面数据绑定全攻略 131 3.3.2 Bind和Eval的区别 140 3.4 ASP.NET编程中的技巧 142 3.4.1 页面之间传值的7种方法 142 3.4.2 get与post方法的区别 146 3.4.3 ASP.NET服务器控件和 HTML控件的区别 146 3.4.4 ...

    旅游公司三层C#网站完整系统

    从文件名称来看,`mi2_log.ldf`和`mi2.mdf`是SQL Server数据库文件,用于存储上述各个模块的数据。`web`可能是一个包含网站源代码和静态资源的文件夹,其中包含了C#代码、HTML、CSS、JavaScript等,用于实现网站的...

Global site tag (gtag.js) - Google Analytics