时间: 2021-07-31 作者:daque
表明:这边只对并发商量做大概的领略,以是在火线冠以“浅谈”二字,计划巨匠无妨居中看到一致的处治本事和堤防的事故,纵然有什么忽略,那也格外地自然,究径自己水平有限,再有很多需要普遍的场所,计划诸生搭档鄙弃矫正!
一.干什么会暴发并发
在我们应用ado.net对数据库中数据进行安排时,很有大约这种安排或普遍地安排也在
收集内其他用户中进行着,那么就难以遏止地会遇到变革安排妨碍的局面。因为为了更好地普遍天性,ado.net采用了切断贯串的方法。也即是说要先把数据的复本读取到存户端,那么也大略惹起多个用户同声变革一条记录暴发数据并发特出。这个安排,很大约是其他用户大概了该行记录,也大约是篡改了某个字段。这个标题是个高等话题,也历来是数据安排中的难点。在下面我只做大概地安置和领略。
二.处治安置
往往处治并发商量的本拥有两个。一个是顽强式并发处治,一个是怒放式并发处治。所
谓的顽强式并发处治,即是应用锁使某条记录被读出后就历来被锁定,直到该用户提交变革。它的缺陷正如它的名字一致,格外地顽强。因为纵然该用户读完该条数据后就因为有处事而解脱大约释怀了来点“变革”安排,那么其他用户要历来等待,直到他回忆大约被引导大约自己想起来。很明显,这不是我们想要看到的(纵然,在确定的要求和基础下该本事也有它的廉价,要不它也没有存在的须要了)。分别,怒放式并发是我们所要安置的重心,这个也是ado.net引见应用的本事。什么是怒放式并发处治本事呢?我自己的领略即是要面对并发特出的展现,拟定处治本事来处治大约指示用户这种特出的展现。既是并发不行遏止,那么我们就要作好处治并发商量的处治安置。这就象一个乐观的人一致,他有了病征,他的心态保持是乐观进步的一致,他要把重心放在还好吗安排上而不是实足地遏止(这个比如大约不太符合,见笑了!呵呵)。在写步伐前要计划到并发展现的大约,依照自己的需要来沿用变革论理和方法。
三.浅论怒放式并发处治的要堤防的场所。(这边也是最大略惹起题手段场所,巨匠要多提管见啊!)
1. 变革方法的沿用 一致来说,变革方法有缓存变革和顿时变革两种。缓存变革,即是应用dataadapter.updte()本事来进行数据的变革。我们大约在datagrid中篡改了很多记录,而只进行一次提交,那么这种安排纵然从读取数据发源(或上回变革安排)算起所中断的工夫越长,也就越大略惹起并发商量。对抗来说,顿时变革,也即是应用command.executenoquery()本事,径自来提交对一条记录的篡改应当比较连忙,但保持不许十足遏止商量的展现,但保持是我引见的方法。
2. 变革论理的沿用 变革论理:我领略的即是按照哪种变革的方法来对数据进行变革安排。它无妨是囊括十足列的;无妨是只囊括主键列的;无妨是囊括主键列和被变革列的;无妨是囊括主键列和工夫戳列的。我们来看这4中变革论理的辨别。纵然你来日用过pb来进行体例步调,那么大约你领略起来就对抗大略。因为pb里面的三种变革论理和这边的有很多普遍的场所。为了更好的表明标题,我们来举一个例子。有表 table1( id,name,sex,address,salary,tamp) 其中的tamp是工夫戳列。那么对应的变革论理为:
(1) update table1 set id=?,name=?,sex=?,address=?,salary=? where id=? and name=? and address=? and salary=?
(2) update table1 set id=?,name=?,sex=?,address=?,salary=? where id=?
(3) update table1 set id=?,name=?,sex=?,address=?,salary=? where id=? and name=? (这边假设只对name列进行篡改,而其他列停止)
(4) update table1 set id=?,name=?,sex=?,address=?,salary=? where id=? and tamp=?
我们来对这4中论理进行简略的表明:第1种也是默认地一种,把十足的字段都囊括进去,那么当灵验户a ,b读取了数据后,a成功变化了一条龙记录中的name,那么纵然b再要变化同行记录时,由于where基础中要求合意十足的字段,而这个工夫name保持变幻了,多么他将变革妨碍。对于第2种本事,它只囊括主键,那么也即是说纵然不篡改主键(或大概)(篡改主键是妨害的,应当遏止!)的话,都会成功,但a变革成功了,b也变革成功了,但b的变革保护了a的变革,这个工夫b及至不领略历来自己变革的工夫记录保持有了变化,a也不领略自己的记录保持被保护。这种本事也叫作“后来居上”的方法。也即是背后的保护火线的安排。这边也说一句,我一致采用该种本事,但不是说它有多好,而是为了连忙开辟。第3种本事,既囊括主键也囊括变革的字段。假设a成地变革了一条记录的name字段,b变革该行记录的sex字段,那么b也会成功的举行自己的变革。但同样,纵然没有变革表白的话,她们都不领略该行记录的对应字段暴发了变化。在pb里,这种方法是被倡议应用的。但在.net里这种方法的创造对抗来说比较懊恼,写的代码也比较多,是种比较奢侈工夫和精力的。对于截止一种方法,它采用了工夫戳列举措变革基础,工夫戳能反馈记录变革的变化。纵然工夫戳变化了,那么该记录自然保持被旁人变革过了。
这种本事是这边引见的本事。纵然每种变革论理都有自己的优点,我们也不许蓄意地应用哪种,要依照自己的体制的局面来沿用。一致来说,第1种方法是dataadapter默认天才的,而第2种,第3种,第4种都要我们自己来竖立。手动地创作变革论理(即是指定对应的insertcommand的commandtext和updatecommand的commandtext和deletecommand的commandtext)是个费时操劳的过程,但变革工效也对抗较高。
3. 变革论理暴发的表明 纵然变革论理是应用dataadapter的启发来暴发的,那么无妨在高等选项里把“应用怒放式并发”的复选框去掉。多么将举行应用这种变革策略。对于那些然而设定dataadapter的selectcommand.commandtext而应用commandbuilder的构造因变量来天才(或应用联系的getupdatecommand等本事)变革论理的步伐,这边倡议不要这么做,纵然多么比较大略,但也为变革时的工效和可遏止性打了扣头。计划巨匠堤防,不到万不得以,不要应用。
4. 纵然变革方法和变革论理都沿用好了尔后,那么就要计划运用功作了。在处事中进行变革安排的截至即是要么实足成功,要么都不行功。大概地说即是“要么全做,要么不做(呵呵,铭记刚毕业在济南处世的工夫,花样组长问我,我即是这么恢复的!)以是运用功作的步伐代码是比较宁靖的。
普遍如次的代码:
dim mytransaction as oledbtransaction
try
conn.open()
mytransaction = conn.begintransaction
cmd1.transaction = mytransaction ‘这边假设保持创作了cmd1货色
cmd1.executenonquery()
mytransaction.commit() '提交处事
catch ex as exception
mytransaction.rollback() '回滚处事
return -1 ‘做一些其他处治
finally
conn.close()
end try
表明:对于dataadapter.update本事,还好吗运用功作呢?从来dataadapter本人并不进行数据变革,而是它的insertcommand,updatecommand,deletecommand。那么就象上面一致竖立这三个command货色的transaction属性就无妨了。其他的和上面没有什么各异。
5. 既是我们在火线说了采用怒放式并发处治,就要对特出进行相应的捕获,给出相应的指示动静和处治本领。对于那些大约惹起特出的代码都要囊括在
try
…
end try
块之间,这是一个很好的风尚。
一致无妨采用普遍下面的安排:
try
sqldpr1.update(ds1.tables("table1"))
catch ex as data.dbconcurrencyexception '并发商量的特出
‘做相应的处治
end try
表明:这边的做相应的处治,无妨是把最新的行从数据库中读出来变革现有的行(纵然纵然该行被大概各别),也无妨从新填补数据(fill安排)。这个工夫我们无妨作出决定,该行是被大概的局面,无妨应用一个因变量将ex.row(“id”)举措参数传递来日,应用一个command.executeschar本事来决定是否记录存在,应用executereader或fill来赢得保持变化的记录或变革实足记录。这边提到了update()本事鼓励的特出,纵然是顿时变革惹起的,处治的方法也是一致的。