SQLserver锁和事务隔离级别的比较与使用

拿得起,放得下 范文 工作总结范文
精选回答

SQLserver锁和事务隔离级别的比较与使用本文简介:SQLserver锁和事务隔离级别的比较与使用对象①锁:每条SQL语句②隔离:事务锁①并发问题丢失更新未确认的读取(脏读)不一致的分析(非重复读):多次读取相同的数据(行)不一致(其他用户更改update)幻像读:多次读取有不存在和新增的数据(其他用户插入insert或删除delete)隔离级别隔离

SQLserver锁和事务隔离级别的比较与使用本文内容:

SQLserver锁和事务隔离级别的比较与使用

对象

锁:每条SQL语句

隔离:事务

并发问题

丢失更新

未确认的读取(脏读)

不一致的分析(非重复读):多次读取相同的数据(行)不一致(其他用户更改update)

幻像读:多次读取有不存在和新增的数据(其他用户插入insert或删除delete)

隔离级别

隔离级别

脏读

不可重复读取

幻像

说明

未提交读(read

uncommitted)

如果其他事务更新,不管是否提交,立即执行

提交读(read

committed默认)

读取提交过的数据。如果其他事务更新没提交,则等待

可重复读(repeatable

read)

查询期间,不允许其他事务update

可串行读(serializable)

查询期间,不允许其他事务insert或delete

提交读

假设存在表A,如下所示

A1

A2

A3

11

21

31

12

22

32

打开查询分析器并打开两个连接,分别输入如下两个事务:

--事务Ⅰ

SET

TRANSACTION

ISOLATION

LEVEL

READ

Committed

begin

tran

update

A

set

A2

=

20

where

A1

=

11

waitfor

delay

00:00:10

rollback

tran

--事务Ⅱ

SET

TRANSACTION

ISOLATION

LEVEL

READ

Committed

select

from

A

where

A1

=

11

如果先运行事务Ⅰ,然后紧接着运行事务Ⅱ,则事务Ⅱ要等待10秒钟(一个连接在修改数据块时别的连接也不能查询这个数据块,直到解锁。反之亦然:读的时候不能写和修改)。

如果把事务Ⅱ改为如下

SET

TRANSACTION

ISOLATION

LEVEL

READ

UNCommitted

select

from

A

where

A1

=

11

那么事务Ⅱ不需等待,立即执行(可以看出READ

UNCommitted事务select不对数据发出共享锁)

锁:(这里主要讲解

共享锁

排他锁

两种经常用到的锁)

共享锁主要是为了共享读(select),如果存在事务(一个或多个)拥有对表中数据(关于锁数据的多少,视锁的粒度而定)的共享锁,不允许对锁定的数据进行更新(update)(从锁的角度讲,即不允许事务获取排他锁,要等到所有的共享锁都释放掉)。反之,如果事务对数据已经具有排他锁(只能有一个),其他的事务就不能对锁定的数据获取共享锁和排他锁(即排他锁与共享锁不能兼容,更多信息请查看锁兼容性),在此特别强调一下

锁定的数据

,因为有的资料上讲解到“一个连接写的时候,另一个连接可以写”,实际上写的这种情况是各个连接的读写的数据不是相同的行,也就是说各个连接锁定的数据不同。

根据以上分析,我们总结为六个字为“共享读,排他写”。

了解了锁的情况之后,又涉及到一个问题。事务究竟要保持锁多久呢?

一般来说,共享锁的锁定时间与事务的隔离级别有关,如果隔离级别为Read

Committed的默认级别,只在读取(select)的期间保持锁定,即在查询出数据以后就释放了锁;如果隔离级别为更高的Repeatable

read或Serializable,直到事务结束才释放锁。另说明,如果select语句中指定了HoldLock提示,则也要等到事务结束才释放锁。

排他锁直到事务结束才释放。

做出了以上分析,现在我们可能会存在这样的疑问,到底在执行SQL语句的时候发出什么样的锁呢,这就由事务的隔离级别决定了。一般情况,读语句(select)发出共享锁,写语句(update,insert,delete)发出排他锁。但是,如果这样不能满足我们的要求怎么办呢,有没有更多选择呢,别急,SQLserver为我们提供了锁定提示的概念。

锁定提示对SQL语句进行特别指定,这个指定将覆盖事务的隔离级别。下面对各个锁定提示分别予以介绍(更多资料请查看SQLserver的联机帮助),笔者做出了以下分类。

类型1

READUNCOMMITTED:不发出锁

READCOMMITTED:发出共享锁,保持到读取结束

REPEATABLEREAD:发出共享锁,保持到事务结束

SERIALIZABLE:发出共享锁,保持到事务结束

类型2

NOLOCK:不发出锁。等同于READUNCOMMITTED

HOLDLOCK:发出共享锁,保持到事务结束。等同于SERIALIZABLE

XLOCK:发出排他锁,保持到事务结束。

UPDLOCK:发出更新锁,保持到事务事务结束。(更新锁:不阻塞别的事物,允许别的事物读数据(即更新锁可与共享锁兼容),但他确保自上次读取数据后数据没有被更新)

READPAST:发出共享锁,但跳过锁定行,它不会被阻塞。适用条件:提交读的隔离级别,行级锁,select语句中。

类型3

ROWLOCK:行级锁

PA***:页级锁

TABLOCK:表锁

TABLOCKX:表排他锁

讲解完锁后,下面结合一个具体实例,具体看一下锁的使用。

在很多系统中,经常会遇到这种情况,要保持一个编号的唯一,如会计软件中的凭证的编号。一种编号的处理是这样的,把表中的最大编号保存到表中,然后在这个编号上累加,形成新的编号。这个过程对并发处理要求非常高,下面我们就来模拟这个过程,看如何保持编号的唯一性。

新建一张表code来保存凭证的最大编号。字段如下:编号:bh(numeric(18,0)),凭证表名pinzheng(varchar(50))

假设表中有这样的一条记录:

Bh

Pinzheng

18000

会计凭证

新建一个存储过程来生成新的凭证编号,如下:

CREATE

PROCEDURE

up_getbh

AS

Begin

Tran

Declare

@numnewbh

numeric(18,0)

select

@numnewbh

=

bh

FROM

code

WITH

(UPDLOCK,ROWLOCK)

where

pinzheng

=

会计凭证

set

@numnewbh

=

@numnewbh

+

1

update

code

set

bh

=

@numnewbh

where

pinzheng

=

会计凭证

print

@numnewbh

Commit

tran

GO

然后,打开查询分析器,并多开几个连接(笔者开了8个连接,模拟有8个人同时并发,读者可以开更多的连接进行试验),把类似以下这样的语句复制到每个连接窗口中,

declare

@i

numeric(18,0)

set

@i

=

1

while

@i

=

1

Begin

if

getdate()

>

2004-07-22

14:23

--设定一个时间,到此时间同时执行upgetbh存储过程

set

@i

=

0

end

c

up_getbh

然后,接连运行各个连接,到2004-7-22

14:23

这一刻,各个连接同时运行up_getbh。从运行结果可以看出连接顺序出现18001开始个数字,并没有重号或丢号的现象。

分析:由于up_getbh中的select语句使用了更新锁,因更新锁之间不能兼容,所以各个连接要等到所有其他的连接释放掉锁才能执行,而更新锁的释放要等到事务结束,这样就不会发生号出错的现象了。

附:锁的兼容性表

现有的授权模式

花香满园 2022-07-04 23:18:32

相关推荐

?怎么读 ?的拼音是什么

的拼音:huàn。的笔画共13画。的部首为文。的解释:《集韻》呼玩切,音喚。斕,文采。通作奐。...
展开详情

心情不好很累很无奈 压抑憋屈的心情说说

1、原来爱情的世界很大,大的可以装下各种委屈。原来爱情的世界很小,小到多个人就挤到窒息。2、我始终无法对你的安危视而不见,你一皱眉,心间想的再也不见即变为了,还是护你周全来得舒服。3、有些事必须要独自承受,又不...
展开详情

给老年长辈的生日祝福 老人生日祝福语简短

1、安逸静谧的晚年,一种休息,一种愉悦,一种至高的享受!祝您福如东海长流水寿比南山不老松!2、祝爸爸身体健康,天天开心,一生平安!3、爸爸生日快乐!敬爱的爸爸,祝愿您岁岁愉快,年年如意!4、奶奶,祝您年年有今日...
展开详情

抬头望望天的伤感说说 心情不好抬头望望天的说说

1、去旅行吧,见的世面多了,你会发现原来在意的那些结根本算不了什么。2、怦然心动只是刹那惊艳,柴米油盐才是一辈子的生活方式。3、爱,是两个人间的彼此折磨4、那一天下着雨,是五月的雨,清清凉凉的,正如听到后,那种...
展开详情

受了伤的揪心说说大全 一个人心情不好的qq说说

1、我爱你,你却没有同样的想法。2、我对你再好,也抵不过她偶尔对你的回眸一笑。3、去到你的城市,吹过你吹过的风,这算不算相拥。4、每一个不想谈恋爱的人,心里都有一个无法拥有的人。5、有些伤口,无论过多久,依然一...
展开详情

精选推荐更多>

李白谪仙人称号出自

李白“谪仙人”称号出自《对酒忆贺监二首》。
原文:
四明有狂客,风流贺季真。长安一相见,呼我谪仙人。昔好杯中物,翻为松下尘。金龟换酒处,却忆泪沾巾。
狂客归四明,山阴道士迎。敕赐镜湖水,为君台沼荣。人亡余故宅,空有荷花生。念此杳如梦,凄然伤我情。
译文:
四明山中曾出现过一个狂客,他就是久负风流盛名的贺季真。在长安头一次相见,他就称呼我为天上下凡的仙人。当初是喜爱杯中美酒的酒中仙,今日却已变成了松下尘。每想想起用盎龟换酒的情景,不禁就悲伤地泪滴沾巾。
狂客贺先生回到四明,首先受到山阴道士的欢迎。御赐一池镜湖水,为您游赏在山光水色之中。人已逝去仅余故居在,镜湖里空有朵朵荷花生。看到这些就使人感到人生渺茫如一场大梦,使我凄然伤情。
这两首诗在艺术上主要采用了今昔对比的手法,随着镜头的一再转换,展现出诗人抚今追昔、感慨万千的心绪。第一首前四句着重对昔日的追忆,但后四句却是在今——昔、今——昔的反复重迭之中,来加强感情的抒发。第二首前四句言昔,后四句言今,同样是在对比之中展示出诗人那极不平静的心绪。这一手法的运用,无疑加强了诗歌的艺术效果。

三国两晋南北朝时期

三国两晋南北朝又称魏晋南北朝,是中国历史上政权更迭最频繁的时期,主要分为三国(曹魏、蜀汉、东吴)、西晋、东晋和南北朝时期,由于长期的封建割据和连绵不断的战争,使这一时期中国文化的发展受到特别的影响。其突出表现则是玄学的兴起、佛教的输入、道教的勃兴及波斯、希腊文化的羼入。
三国至隋的三百六十余年间,以及在三十余个大小王朝交替兴灭过程中,上述诸多新的文化因素互相影响,交相渗透的结果,使这一时期儒学的发展及孔子的形象和历史地位等问题也趋于复杂化。
三国(220年-280年)是中国历史上的一段时期,主要有曹魏、蜀汉及孙吴三个政权。汉末三国战争不断,使得中国的人口急剧下降,经济严重受到损害,因此三国皆重视经济发展,加上战争带来的需求,各种技术都有许多进步。
晋朝分为西晋与东晋。公元266年司马炎代魏称帝(晋武帝),国号曰晋,建都洛阳,史称西晋。公元280年灭吴,统一全国,秦汉以来的分裂,至此再度统一。统治疆域东、南至海,西至葱岭,南至越南,北至大漠,东至辽东。
南北朝(公元420年—589年),由公元420年刘裕篡东晋建立南朝宋开始,至公元589年隋灭南朝陈为止,上承东晋、五胡十六国,下接隋朝。因为南北两势长时间对立,所以称南北朝。南朝(420年—589年)包含宋、齐、梁、陈等四朝;北朝(386年—581年)包含北魏、东魏、西魏、北齐和北周等五朝。

计熟事定 举必有功什么意思

“计熟事定,举必有功”是汉语词汇,意思是计划成熟,事情安排就绪,战争的发动必定成功。出自唐代刘禹锡《为淮南杜相公论西戎表》。
原文节选:
臣负恩方镇,初惧寇戎,正于忧迫之时,果闻仁圣之谕。攘却凶孽,不劳干戈。臣静思远图,为国久计,莫若存信施惠,多愧其心。岁通玉帛,待以客礼。昭宣圣德,择奉谊之臣;恢拓皇威,选谨边之将。积粟塞下,坐甲关中;以逸待劳,以高御下。重以金玉之赠,结以舅甥之欢。小来则慰安,大至则严备。明其斥候,不挠不侵。则戎狄为可封之人,沙场无战死之骨。若天下无事,人安岁稔,然后训兵,命将破虏。摧衡原州,营田灵武。尽复旧地,通使安西。国家长算,悉在于此。计熟事定,举必有功;苟未可图,岂宜容易。此皆陛下朝夕倦谈之事,前后立验之谋。臣质性顽疏,筹画庸近。受恩非据,敢忘献忠?犬马之心,实所罄尽。谨遣某官奉表。
刘禹锡(772~842),唐代文学家、哲学家。字梦得,洛阳(今属河南)人,自言系出中山(治今河北定县)。贞元间擢进士第,登博学宏辞科。授监察御史。曾参加王叔文集团,反对宦官和藩镇割据势力,被贬朗州司马,迁连州刺史。后以裴度力荐,任太子宾客,加检校礼部尚书。世称刘宾客。和柳宗元交谊甚深,人称“刘柳”;又与白居易多所唱和,并称“刘白”。其诗通俗清新,善用比兴手法寄托政治内容。

衔得云中尺素书什么意思

“衔得云中尺素书”意思是给她衔来了一封书信。出自唐代李白的《捣衣篇》,是南北朝乐府旧题,此题起源于古琴曲《捣衣》。此篇题作“捣衣”,《乐府诗集》未收,诗中并不着重写捣衣,只闲闲地提了一句“夜捣戎衣向明月”,因此“捣衣”只是作为闺怨的代词。李白此诗是为闺怨而作。
原文:
闺里佳人年十馀,嚬蛾对影恨离居。
忽逢江上春归燕,衔得云中尺素书。
玉手开缄长叹息,狂夫犹戍交河北。
万里交河水北流,愿为双燕泛中洲。
君边云拥青丝骑,妾处苔生红粉楼。
楼上春风日将歇,谁能揽镜看愁发。
晓吹员管随落花,夜捣戎衣向明月。
明月高高刻漏长,真珠帘箔掩兰堂。
横垂宝幄同心结,半拂琼筵苏合香。
琼筵宝幄连枝锦,灯烛荧荧照孤寝。
有便凭将金剪刀,为君留下相思枕。
摘尽庭兰不见君,红巾拭泪生氤氲。
明年若更征边塞,愿作阳台一段云。
此诗的开头就写少妇在闺中愁思远人,忽得来信,报道丈夫仍滞留交河之北。其实不必一定要信来,信也不会由春燕捎来,春燕从南边海上归来也不可能带来极北的交河的信,这些都是虚拟,甚至是不合理的虚拟,只是借以画出闺中思妇“愿为双鸟泛中洲”的遐想而已。诗的场景是在少妇的闺房,全诗充满渲染闺房里的景况和闺中独处的哀怨;并以想象中的征夫的处境“君边云拥青丝骑”、“晓吹员管随落花”和眼前闺中的光景对照,点染出少妇的魂驰塞外。
常见热点问答
热点搜索
1-20
21-40
41-60
61-80
81-100
101-120
121-140
141-160
161-180
181-200
作文大全
1-20
21-40
41-60
61-80
81-100
101-120
121-140
141-160
161-180
181-200