当前位置: 首页 > 编程日记 > 正文

SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)

五、锁与事务隔离级别

事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误。设置事务隔离级别将影响整条连接。

SQL Server 数据库引擎支持所有这些隔离级别:

· 未提交读(隔离事务的最低级别,只能保证不读取物理上损坏的数据)

· 已提交读(数据库引擎的默认级别)

· 可重复读

· 可序列化(隔离事务的最高级别,事务之间完全隔离)

SQL Server 还支持使用行版本控制的两个事务隔离级别。一个是已提交读隔离的新实现,另一个是新事务隔离级别(快照)。

设置语句如下:

SET TRANSACTION ISOLATION LEVEL

{ READ UNCOMMITTED

| READ COMMITTED

| REPEATABLE READ

| SNAPSHOT

| SERIALIZABLE

}

[ ; ]

(一)未提交读

未提交读是最低的事务隔离级别,允许读取其他事务已经修改但未提交的数据行。SQL SERVER 当此事务等级进行尝试读取数据时,不会放置共享锁,直接读取数据,所以忽略已存在的互斥锁。换句话说,即使该资源已经受到了独占锁的保护,当使用未提交读隔离级别时,此数据还是可以被读取,加快查询速度,但是会读取到别人未修改的数据,所以此种读取被称为脏读。此种隔离级别适合不在乎数据变更的查询场景。此隔离级别与SELECT 语句搭配 NOLOCK 所起到的效果相同

未提交读示例:

--1.--1.创建测试表

create table tbUnRead

(ID INT,

name nvarchar(20)

)

--2新增记录

insert tbUnRead

select 1,'Tom'

union

select 2,'Jack'

--3开启事务,并进行更新

begin tran

update tbUnRead

set name='Jack_upd'

where ID=2

---4查询事务数量(由于没有回滚或提交事务)

SELECT @@TRANCOUNT

事务查询结果如下:

--5打开另一条连接,设置事务隔离级别为(未提交读)

set Transaction isolation level read uncommitted

--6查询数据,查询到的数据是修改之后的数据。

select * from tbUnRead where ID=2

如下图:

(二)已提交读

已提交读是SQL SERVER 默认的事务隔离级别。当事务正在读取数据时,SQL SERVER 会放置共享锁以防止其他事务修改数据,当数据读取完成之后,会自动释放共享锁,其他事务可以进行数据修改。因为共享锁会同时封锁封锁语句执行,所以在事务完成数据修改之前,是无法读取该事务正在修改的数据行。因此此隔离级别可以防止脏读。

在SQL SERVER 2005以上版本中,如果设置READ_COMMITTED_SNAPSHOT为ON,则已提交读的事务全使用数据行版本控制的隔离下读取数据。读取操作不会获取正被读取的数据上的共享锁(S 锁),因此不会阻塞正在修改数据的事务。同时,由于减少了所获取的锁的数量,因此最大程度地降低了锁定资源的开销。使用行版本控制的已提交读隔离和快照隔离旨在提供副本数据的语句级或事务级读取一致性。

示例一:设置READ_COMMITTED_SNAPSHOT为OFF

--1.创建测试表

create table tbUnRead

(ID INT,

name nvarchar(20)

)

--2新增记录

insert tbUnRead

select 1,'Tom'

union

select 2,'Jack'

--3开启事务,并进行更新

begin tran

update tbUnRead

set name='Jack_upd'

where ID=2

---4查询事务数量(由于没有回滚或提交事务)

SELECT @@TRANCOUNT

--5打开另一条连接,设置事务隔离级别为(已提交读)

set Transaction isolation level read committed

--6查询数据,由于当前事务没有提交,所以无法查询数据

select * from tbUnRead where ID=2

6查询数据的结果 如下图:

示例二:设置READ_COMMITTED_SNAPSHOT为ON

use master

go

---创建测试数据库

create database read_committed_SNAPSHOT_Test

go

---激活数据行版本控制

alter database read_committed_SNAPSHOT_Test  set read_committed_SNAPSHOT on

go

use read_committed_SNAPSHOT_Test

go

--1.创建测试表

create table tbReadLevel

(ID INT,

name nvarchar(20)

)

--2新增记录

insert tbReadLevel

select 1,'测试'

go

select ID,name as "修改前数据"  from tbReadLevel

如下图:

go

--3开启事务,并进行更新

begin tran

update tbReadLevel

set name='Jack_upd'

where ID=1

---4查询事务数量(由于没有回滚或提交事务)

SELECT @@TRANCOUNT

--5打开另一条连接,设置事务隔离级别为(已提交读)

--查询数据,查询到的数据是上一次提交的数据

select * from tbReadLevel where ID=1

5的查询结果如下图:

(三)可重复读

可重复读事务隔离级别在事务过程中,所有的共享锁均保留到事务结束,而不是读取结束就释放,这与已提交读的行为截然不同,虽然在事务过程中,重复查询相同记录时不受其他事务的影响,但可能由于锁定数据过久,而导致其他人无法处理数据,影响并发率,更严重的可能提高发生死锁的机率。

总之,如果使用可重复读隔离级别读取数据,数据读出之后,其他事务只能对此范围中的数据进行读取或新增,但不可以进行修改,直到读取事务完成。因此,使用此隔离级别需要谨慎小心,根据实际情况进行设置。

示例:

--1.创建测试表

create table tbUnRead

(ID INT,

name nvarchar(20)

)

--2新增记录

insert tbUnRead

select 1,'Tom'

union

select 2,'Jack'

--3设置事务隔离级别为(可重复读)

set Transaction isolation level REPEATABLE READ

--4开启事务,并进行更新

begin tran

--5查询数据

select * from tbUnRead where ID=2

---6查询事务数量(没有回滚或提交事务)

SELECT @@TRANCOUNT

5与6的执行结果如下图

---7开启另一条连接,查询数据与修改数据

---事务虽然没有完成,但可以查询到之前的数据

select * from tbUnRead where ID=2

Go

---8,修改数据,由于事务没有完成,所以无法进行修改

update tbUnRead

set name='Jack_upd'

where ID=2

go

--7、8的执行结果如下,可以查询数据,但无法更新数据,如下图。

(四)快照

快照隔离级别是SQL SERVER 2005之后版本新增的隔离级别,开启之后,允许事务过程中读取操作不受异动影响,事务中任一语句所读取的数据,均予事务激活时,就已经完成提交,符合事务一致性的数据行版本。所以只能查核事务激活之前已经完成提交的数据,也就是说可以查询已经完成提交的数据行快照集,但看不见已激活的事务正在进行修改的数据行。当使用快照隔离级别读取数据时不会要求对数据进行锁定,如果所读取的记录正在被某事务进行修改,它也会读取此记录之前已经提交的数据。故当某记录被事务进行修改时,SQL SERVER的TEMPDB数据库会存储最近提交的数据行,以供快照隔离级别的事务读取数据时使用。将Allow_SNAPSHOT_isolation设为ON,事务就会设置快照隔离级别。

use master

go

---创建测试数据库(快照)

create database SNAPSHOT_Test

go

---激活数据行版本控制

alter database SNAPSHOT_Test  set Allow_SNAPSHOT_isolation on

go

use SNAPSHOT_Test

go

--1.创建测试表

create table tbReadLevel

(ID INT,

name nvarchar(20)

)

--2新增记录

insert tbReadLevel

select 1,'测试'

union

select 2,'快照测试'

go

select ID,name as "修改前数据"

from tbReadLevel

go

--3开启事务,并进行更新

begin tran

update tbReadLevel

set name='Jack_upd_快照'

where ID=1

---4查询事务数量(没有回滚或提交事务)

SELECT @@TRANCOUNT

--2、4的执行结果,如下图。

--5打开另一条连接,设置事务隔离级别为(快照)

set Transaction isolation level SNAPSHOT

--6查询数据,查询的数据是上一次提交的数据

select * from tbReadLevel where ID=1

(五)可序列化

可序列化是事务隔离级别中最高的级别,为最严谨的隔离级别,因为它会锁定整个范围的索引键,使事务与其他事务完全隔离。在现行事务完成之前,其他事务不能插入新的数据行,其索引键值存在于现行事务所读取的索引键范围之中。此隔离级别与Select 搭配holdlock效果一样。

示例:

--1.创建测试表

create table tbUnRead

(ID INT,

name nvarchar(20)

)

--2新增记录

insert tbUnRead

select 1,'Tom'

union

select 2,'Jack'

--3设置事务隔离级别为(可序列化)

set Transaction isolation level SERIALIZABLE

--5开启事务,并进行更新

begin tran

select * from tbUnRead where ID=2

---6查询事务数量(没有回滚或提交事务)

SELECT @@TRANCOUNT

5、6执行结果如下图。

---7,开启另一条连接,查询数据,可以查询到之前的数据

select * from tbUnRead where ID=2

---8,修改数据,无法修改数据

update tbUnRead

set name='Jack_upd'

where ID=2

--新增数据,无法插入数据

insert tbUnRead

select 3,'May'

转载于:https://www.cnblogs.com/littlewrong/p/9025759.html

相关文章:

开源造轮子:一个简洁,高效,轻量级,酷炫的不要不要的canvas粒子运动插件库...

一:开篇 哈哈哈,感谢标题党的莅临~ 虽然标题有点夸张的感觉,但实际上,插件库确实是简洁,高效,轻量级,酷炫酷炫的咯。废话不多说,先来看个标配例子吧: (codepe…

python启动appium服务_python下appium服务的自启动和关闭

最近想把前不久写的webUi框架改写成mobile_Ui,也就是 用于手机端的UI自动化框架,目前已经完成该框架的改写,记录其中一些问题,框架后续会单独写篇幅介绍遇到的第一个问题就是1、python怎么能够自动启动和自动关闭appium服务,这样每…

以太坊源码分析

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 前言:人类正在步入数据时代。如今,全球每天就产生超过500亿GB的数据,据IDC预测,到2025年这一数据将超…

yapi-docker

yapi-docker 转载于:https://www.cnblogs.com/vickey-wu/p/9026153.html

灵活性是原则性基础上的灵活

灵活性是原则性基础上的灵活,没有原则性的灵活是耍流氓。 原则性是质,灵活性是量,灵活性有度的要求,就是不能改变质。转载于:https://www.cnblogs.com/jcode/p/5961867.html

办公室自动化系统_信息化管理建设 公司办公室用自动盖章机贵吗?

办公室自动盖章机的应用我们首先要考虑到底有没有用,之后在考虑贵不贵的问题。自动盖章机也称智能印章,是企业单位建设信息化印章管理方式的一种,过去由于人工盖章和管章效率低,且风险较大,为了避免因印章管理不当引起…

加密货币银行是什么?它又将如何运作?

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 比特币曾经承诺,将帮助每个人拥有“属于自己的 银行 ”。但这里需要强调一点,在了解到银行实际提供的众多服务之后&#xff…

【Python】实现将testlink上的用例指定格式保存至Excel,用于修改上传

背景 前一篇博客记录的可以上传用例到testlink指定用例集的脚本,内部分享给了之后,同事希望能将testlink上原有的用例下载下来,用于下次修改上传,所有有了本文脚本。 具体实现 获取用例信息 def download_testcase():""…

Java随机字符串:随机数字字符串,工具类

Java中生成随机数,字符串的工具类 1. 调用方法需要传入生成字符串的长度和需要的类型 生成随机数字 生成随机字母字符串 生成随机字符串数字等 ......... 2. 总共8种类型,具体看工具类中的注释。 1 import java.util.Date;2 import java.util.Random;3 i…

python怎么查看代码错误_python中的错误如何查看

python常见的错误有1.NameError变量名错误2.IndentationError代码缩进错误3.AttributeError对象属性错误4.TypeError类型错误5.IOError输入输出错误6.KeyError字典键值错误具体介绍1.NameError变量名错误报错:>>> print aTraceback (most recent call last…

Facebook的加密货币即将到来会对整个加密货币领域意味着什么

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 Facebook的加密货币即将到来,它对整个加密货币领域意味着什么?这里不仅涉及到用户采用、节点参与,还涉及到合规、…

threadlocal使用场景_深入剖析ThreadLocal

点击上方 IT牧场 ,选择 置顶或者星标技术干货每日送达朋友们在遇到线程安全问题的时候,大多数情况下可能会使用synchronized关键字,每次只允许一个线程进入锁定的方法或代码块,这样就可以保证操作的原子性,保证对公共资…

zabbix 监控tomcat实例

zabbix 监控tomcat实例环境:CentOS 7.2zabbix-3.0.5 LTSnginx-1.10.1php-7.0.11mariadb-10.1.18tomcat-9请参看zabbix-3.0.x LTS源码安装配置Tomcat7/8/9安装配置tomcat启用jmxhttp://tomcat.apache.org/tomcat-9.0-doc/monitoring.htmlhttp://docs.oracle.com/javase/6/docs/t…

什么是USDT以及如何使用它?

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 什么是USDT? 如果您使用Poloniex或Bittrex交易所交易,那么您可能已经多次见过UDST市场了,您甚至经常使用它。 …

BZOJ3930: [CQOI2015]选数

BZOJ3930: [CQOI2015]选数 Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L1)^N种方案。 小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数&#xf…

the job was canceled什么意思_这些英语短语,因为相差一个“the”导致意思大不相同!...

今天有小伙伴在我文章下面留言,说到了两个短语,同样是因为两者之间相差一个“the”而造成了意义完全不同。分别是“out of question”和“out of the question”,第一个没有“the”意思是“毫无疑问、无疑的”意思。第二个则是“不可能的”。…

php中类和对象的操作

在类中用$this指代对象本身。 用self::指代类本身。 $p1 new Person(michael);//向Person类的构造函数__construct中传名字 echo($p1->name);//获取对象p1的public实例属性name(注意没有$) $p1->speak();//调用对象p1的实例方法speak echo(Person::$sex);//获取类变量(s…

关于区块链的知识

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 1 是什么导致了区块链的出现? 互联网的信任缺失导致了区块链技术的出现 在互联网上最缺乏的就是信任了,1993年《纽约客》…

JavaScript 表单与表单验证

JavaScript 表单 JavaScript 表单验证 HTML 表单验证可以通过 JavaScript 来完成。 以下实例代码用于判断表单字段(fname)值是否存在,如果存在,则弹出信息,否则阻止表单提交: JavaScript 实例 function validateForm() { var x d…

iOS项目的本地化处理(多国语言)

项目的本地化就是:iOS系统在不同语言环境下自动切换语言,从而实现一个app发布到全世界各个国家的AppStore上。 我们不仅仅需要在iOS项目中做本地化处理,在上架iOS APP的时候,也需要做对应的本地化设置哦。 iOS项目中需要处理的本地…

synchronized底层原理_你用过synchronized吗?它的底层原理是什么?Java经典面试题来了...

并发编程已经成为程序员必备技能作为Java程序员,不懂得并发编程显然已经不能满足市场需求了,尤其是在面试过程中将处于被动地位,也有可能面试将就此终结。那么作为Java开发者的你,日常虽然可以基于Java的并发工具包实现并发编程&a…

一个比特币要挖多久?

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 一个比特币要挖多久 比特币怎么挖能赚钱吗比特币要用专门的挖矿机来挖。平均一个挖到的时间几周到几个月不等。要看你的机器的规模了。 一台普通笔…

[UE4]死亡后调整视角

AddLocalOffset:本地坐标偏移。 脱离控制器操作 会影响“OnDie”方法里面的相机移动操作,而函数里面又不允许使用“Delay”方法,但可以使用“Set Timer By Function Name”方法。 转载于:https://www.cnblogs.com/timy/p/9036267.html

git 设置 key 到服务器,同步代码不需要输入用户名和密码

1 ssh-keygen -t rsa 2 vim ~/.ssh/id_rsa.pub 3. 添加到git 服务器,这样同步代码就不需要输入密码转载于:https://www.cnblogs.com/likwo/p/5975809.html

26个音序的正确写法和占格_部编语文汉语拼音音序表,示范朗读+视频教学

部编语文《汉语拼音音序表》♬点击上方绿标收听音频这位老师教的有点喜感,但读得基本是正确的。《汉语拼音方案》给每个字母规定了名称音读法,这是朗读字母表。小学汉语拼音字母表教学中存在两种读法,一种是《方案》规定的名称来读&#xff0…

分布式块存储架构

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 1.块存储简介 块存储,简单来说就是提供了块设备存储的接口。用户需要把块存储卷附加到虚拟机(或者裸机)上后才可以与其交互。…

Tomcat_7.x压缩版_环境变量配置(亲测有效)

自行下载配置JDK, I。下载Tomcat7,解压到合适的目录,文件夹尽量浅,我的Tomcat路径是D:\tom7 II。配置环境变量 1.打开到环境变量,新建变量名:CATALINA_HOME,变量值:D:\tomcat2.打开P…

Atitit 为什么网络会有延时 电路交换与分组交换的区别

Atitit 为什么网络会有延时 电路交换与分组交换的区别 按道理,网络是电子设备联网,应该达到光速才对。。 本质上因为互联网基于分组交换而不是电路交换。 分组交换相当于队列方式,别人发你的数据包先存储在交换机队列里面存储,它空…

python自己做电子词典_python实现电子词典

本文实例为大家分享了python实现电子词典的具体代码,供大家参考,具体内容如下服务端#!/usr/bin/env python3from __future__ import unicode_literals# codingutf-8from socket import *import osimport pymysqlimport timeimport sysimport signalDICT_…

区块链技术开发三个优势

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 区块链技术开发公司目前的开发空间之大难以述清,尤以对产业转型中的应用较为广泛,但由于区块链技术开发公司目前尚正处风口&…