??xml version="1.0" encoding="utf-8" standalone="yes"?>二区在线观看,日本护士...精品国,欧美人成免费网站http://www.aygfsteel.com/imdosop/category/50609.htmlq记得年时的梦?/description>zh-cnThu, 12 Jan 2012 06:26:34 GMTThu, 12 Jan 2012 06:26:34 GMT60Oracle锁机刉问题的详l分?/title><link>http://www.aygfsteel.com/imdosop/archive/2008/11/07/239266.html</link><dc:creator>東頭bing阉K</dc:creator><author>東頭bing阉K</author><pubDate>Fri, 07 Nov 2008 07:40:00 GMT</pubDate><guid>http://www.aygfsteel.com/imdosop/archive/2008/11/07/239266.html</guid><wfw:comment>http://www.aygfsteel.com/imdosop/comments/239266.html</wfw:comment><comments>http://www.aygfsteel.com/imdosop/archive/2008/11/07/239266.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/imdosop/comments/commentRss/239266.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/imdosop/services/trackbacks/239266.html</trackback:ping><description><![CDATA[在Q何多用户数据库应用中,最l必然会(x)出现两个用户希望同时处理相同记录的情?q种情况在逻辑上是不可能的,q且数据库必ȝ保其在物理上也是不可能的.事务隔离性原则要求数据库保证:?,q个?x)话无法影响另一个会(x)?q且后者也无法看到前?Z(jin)实现q个要求,数据库创行话q发的数据访?甚至在多个会(x)话请求访问相同的记录?数据库也必须保q些?x)话排队依次q行.<br /> 借助于记录和表锁定机?我们可以实现q发的串行化.oracle数据库中的锁定是完全自动?一般而言,只有在试囄合Y件与自动锁定机制是或者编Eh员编写的代码太糟p时才会(x)引发某些问题.<br /> <br /> <strong>׃n锁与排他?br /> </strong> <p>Oracle数据库中锁定的标准别保证了(jin)最大可能的q发U别也就是说,如果某个?x)话正在更新一条记?那么只有q条记录?x)被锁?此外,锁定q条记录是ؓ(f)?jin)防止其他?x)话对其进行更?其他?x)话可以随时执行d操作.只有在用commit或rollback命o(h)l束事务之后,锁定才会(x)被解?q种锁定是一?#8221;排他?#8221;:在指定记录上h排他锁的W一个会(x)话会(x)得到q个锁定,其他h对该记录q行写访问的?x)话则必ȝ?虽然q条记录已通过锁定?x)话q行?jin)更?但是对其q行读访问你是被允许?而且l常?x)出现这U情?,q且q些L作会(x)涉及(qing)撤销数据的?从而确保都?x)回q不?x)看CQ何未被提交的变化对于一条记录或一个完整表上的一个排他锁来说,每次只能有一个会(x)话可以获得这个排他锁,不过许多?x)话可以同时获得相同对象上?#8221;׃n?#8221;.在一条记录上讄׃n锁毫无意?其原因在于锁定一条记录的唯一目的是不允许其他会(x)话更改它.׃n锁被|于整个表上,同时许多?x)话可以获得同一个表上的׃n?在一个表上放|共享锁的目的是Z(jin)防止另一个会(x)话获得这个表上的排他?在已存在׃n锁的情况下无法再获得排他?.在表上防止排他锁是需要执行DDL语句.如果其他M?x)话已经在一个表上放|了(jin)׃n?那么我们无法执行修Ҏ(gu)个对象的语句(例如删除q个表的某一?.<br /> Z(jin)在记录上执行DML语句,当前?x)话必须获取待更新记录上的排他锁以?qing)包含q些记录的表上的׃n?如果另一个会(x)话已l获取了(jin)待更新记录上的排他锁,那么当前?x)话被挂v,直至使用COMMIT或ROLLBACK命o(h)解除q些锁定,如果另一个会(x)话已l获取了(jin)待修改记录的表上的共享锁以及(qing)其他记录上的排他?那么׃存在M问题.一个表上的排他锁会(x)锁定q个?但是,如果不需要执行DDL语句,那么我们可以不锁定整个表的默认锁定机制.<br />  <br /> 提示:只有在特别请求ƈ且编Eh员具有充分理q情况?才可以要求在整个表上攄排他?<br /> <br /> <strong>DML锁与DDL?/strong><br /> 所有DML语句都至需要两U锁?受媄(jing)响记录上的排他锁,以及(qing)包含受媄(jing)响记录的表上的共享锁.排他锁能够防止其他会(x)话干预指定的记录,而共享锁则能够阻止其他会(x)话用DDL语句修改表的定义.q两U锁定会(x)被自动请?如果某条DML语句在指定记录上无法获取所需的排他锁,那么q条语句?x)被挂v直至获得所需的排他锁.<br /> 执行DDL命o(h)需要用所涉及(qing)对象上的排他?只有在针Ҏ(gu)定表的所有DML事务l束,q且记录上的排他锁以?qing)表上的׃n锁都被解除之?我们才可以获得执行DDL命o(h)所需的排他锁,MDDL语句所需的排他锁都是被自动请求的.但是,如果无法获取所需的排他锁(通常是因为其他会(x)话已l获得用于DML语句的共享锁),那么DDL语句׃(x)׃错误立即l止.<br />  <br /> <strong>例子:</strong><br /> 1.       使用SQL*PLUS,作ؓ(f)用户SYSTEMq接数据?<br /> 2.       创徏一个表,q且在这个表中插入一条记?<br /> >create table t1(c1 number);<br />        >insert into t1 values(1);<br />        >commit;<br /> 3.再次使用SQL*PLUSq作为用户SYSTEMq行q接,从而打开另一个会(x)?<br /> 4.在第一个会(x)话中执行一个DML命o(h),q个命o(h)?x)在插入的记录上攄一个排他锁,同时q(sh)(x)在创建的表上攄一个共享锁.<br />    >update table t1 set c1=2 where c1=1;<br /> 5.如下所C?在第二个?x)话中执行第一条针Ҏ(gu)的DDL语句.<br />    >alter table t1 add(c2 date);<br />    error at line 1:<br /> ora-00054:resource busy and acquire with nowait specified<br /> 因ؓ(f)DDL语句需要表上的排他?而这与DML语句已在表上攄?jin)共享锁相冲H?所以试囑֜表中插入一个列的这条DDL语句?x)失?需要注意的?在类似情况下,DML语句?x)等待ƈ不断q行试,直至获得其所需的锁(换句话说是挂v);而DDL语句则会(x)׃错误立即l止.<br />        6.在第一个会(x)话中,提交当前事务<br />           >commit;<br />        7.在第二个?x)话?重新执行步骤5.此时,因ؓ(f)不纯在与DDL排他锁相冲突的DML׃n?因此DDL语句成功的执行.<br />        8.在第一个会(x)话中 ,锁定整个?<br />         >lock table t1 in exclusive mode;<br />        9.在第二个?x)话?插入一条记?此时,q个?x)话被挂v.<br />         >insert into t1 values (1,sysdate);<br />        10.在第一个会(x)话中,通过执行COMMIT命o(h)解除整个表上的锁?需要注意的?ROLLBACK命o(h)也可以实现相同的目的.<br />         >commit;<br />        11.W二个会(x)话会(x)释放q且现在?x)完成插入操?随后,执行COMMIT命o(h),l止当前事务斌且解除该记录上的排他锁.</p> <p><strong>关于如何解决死锁的问?</strong><br /> Q?查哪个过E被?br /> 查V$DB_OBJECT_CACHE视图:<br /> SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER=''q程的所属用?' AND LOCKS!=''0'';</p> <p>2. 查是哪一个SID,通过SID可知道是哪个SESSION.<br /> 查V$ACCESS视图:<br /> SELECT * FROM V$ACCESS WHERE OWNER=''q程的所属用?' AND NAME=''刚才查到的过E名<br /> <br /> <em style="font-size: 10pt; color: #c0c0c0">版权归原作者和各发布网站所有,此文章仅供学?fn)参考之?/em> <br /> </p> <img src ="http://www.aygfsteel.com/imdosop/aggbug/239266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/imdosop/" target="_blank">東頭bing阉K</a> 2008-11-07 15:40 <a href="http://www.aygfsteel.com/imdosop/archive/2008/11/07/239266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>锁等待的诊断?qing)排?/title><link>http://www.aygfsteel.com/imdosop/archive/2008/11/07/239225.html</link><dc:creator>東頭bing阉K</dc:creator><author>東頭bing阉K</author><pubDate>Fri, 07 Nov 2008 06:32:00 GMT</pubDate><guid>http://www.aygfsteel.com/imdosop/archive/2008/11/07/239225.html</guid><wfw:comment>http://www.aygfsteel.com/imdosop/comments/239225.html</wfw:comment><comments>http://www.aygfsteel.com/imdosop/archive/2008/11/07/239225.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/imdosop/comments/commentRss/239225.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/imdosop/services/trackbacks/239225.html</trackback:ping><description><![CDATA[在ORACLE中,Z(jin)保证数据的一致性,在对数据库中的数据进行操作时Q系l会(x)q行Ҏ(gu)据相应的锁定?br /> 当程序对所做的修改q行提交(commit)或回滚后(rollback)后,锁住的资源便?x)得到释放,从而允许其它用戯行操作?<br /> 但是Q有Ӟ׃E序中的原因Q锁住资源后长时间未对其工作q行提交Q或是由于用L(fng)原因Q如调出需要修改的数据后,未及(qing)时修改ƈ提交Q而是攄于一旁;或是׃客户服务器方式中客户端出?L"Q而服务器端却q未(g)到Q从而造成锁定的资源未被及(qing)旉放,影响到其它用L(fng)操作?<br /> q时Q我们需要迅速地诊断出锁住资源的用户q解军_锁定?<br /> <br /> 1. 诊断pȝ中的?br /> Z(jin)扑ևpȝ中那些用户锁住资源以?qing)那些用户在{待相应的资源,可用以下语?其中?*+ NO_MERGE(..) */千万不可省略, 否则?x)很?Q?br /> <br /> -- looklock.sql<br /> -- use the NO_MERGE hints can speed up the query<br /> select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ 'Wait' "Status", a.username, a.machine, a.sid, a.serial#, a.last_call_et "Seconds", b.id1, c.sql_text "SQL"<br /> from v$session a, v$lock b, v$sqltext c<br /> where a.username is not null<br /> and a.lockwait = b.kaddr<br /> and c.hash_value =a.sql_hash_value<br /> union<br /> select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ 'Lock' "Status", a.username, a.machine, a.sid, a.serial#, a.last_call_et "Seconds", b.id1, c.sql_text "SQL"<br /> from v$session a, v$lock b, v$sqltext c<br /> where b.id1 in<br /> (select /*+ NO_MERGE(d) NO_MERGE(e) */ distinct e.id1<br /> from v$session d, v$lock e<br /> where d.lockwait = e.kaddr)<br /> and a.username is not null<br /> and a.sid = b.sid<br /> and b.request=0<br /> and c.hash_value =a.sql_hash_value;<br /> <br /> 执行后的l果如下所C:(x)<br /> Stat USERNAME MACHINE SID SERIAL# Seconds ID1<br /> ---- ------------------------------ ---------------- --------- --------- --------- ---------<br /> SQL<br /> ----------------------------------------------------------------<br /> Lock CIQUSR CIQ\DULMACER 12 966 245 131089<br /> select * from c_trade_mode for update<br /> <br /> Wait CIQUSR CIQ\DULMACER 10 735 111 131089<br /> update c_trade_mode set x_name = 'zzz' where x_code='5'<br /> <br /> Wait CIQUSR CIQ\DULMACER 15 106 1094 131089<br /> select * from c_trade_mode for update<br /> <br /> <br /> 其中Q?br /> Status有两U状态,LOCK表明该进E锁住了(jin)某个资源QW(xu)AIT表示该进E正在等待某个资源?br /> Username, Machine分别为ORACLE用户名及(qing)机器?br /> SIDQSERIAL#可用于随后的解锁操作<br /> Seconds表示该进E最后一ơ进行操作至当前的时?U?<br /> ID1, 锁标识。某个LOCK状态的ID1与某个WAIT状态的ID1相同Q可说明锁的正是另一个进E等待的?br /> SQL: 锁住资源的SQL语句<br /> <br /> 2. 解除?br /> <br /> 诊断出锁的状态后Q若发现该阻塞其它用戯E的q程是正常操作中Q则可通知该用户对其进行提交,从而达到释N资源的目的;若ؓ(f)非正常操作,卻I其状态ؓ(f)"inactive"Q且其Seconds已ؓ(f)较多长时_(d)则可执行以下语句该q程q行清除Q系l会(x)自动对其q行回滚Q从而释N住的资源?<br /> <br /> alter system kill session 'sid, serial#'; <br /> <br /> 例如: 对于上例中显C的l果, 可用以下语句清除锁住资源的进E?<br /> alter system kill session '12, 966'; <br /> <br /> 关于你所_(d)(x)在网l断掉(通过拔掉|线Q或非正常终止进E(通过task manager关闭sql*plus)Ӟoracle在有限的旉内(我只观查?-10分)(j)内,oracle未能对该q程作Q何处理?br /> q个处理与TCP协议有关Q因为SQL NET在用TCP/IP协议q行|络q接时是一U短q接,当ORACLEq接异常l止Ӟ因ؓ(f)是异常终止,l止信号q没有通过|络通知server端,因此只有下次server有结果从服务器端q回需与client通信Ӟserver才会(x)发现此client已经端掉。因此出C前面所提ORACLE处理异常l止q程延时情况.<br /> 死锁Q你可以试验一条彼此存在依赖关pȝupdate语句QORACLE处理q种锁时不是很好?br /> <br /> 查锁语句Q查询生锁的用户锁sql<br /> select a.username username, a.sid sid, a.serial# serial,b.id1 id1, c.sql_text sqltext<br /> from v$session a, v$lock b, v$sqltext c<br /> where b.id1 in<br />    (select distinct e.id1<br />    from v$session d, v$lock e<br />    where d.lockwait = e.kaddr)<br />    and a.sid = b.sid<br />    and c.hash_value = a.sql_hash_value<br />    and b.request = 0;<br /> <br /> <br /> 死锁Q当两个事务需要一l有冲突的锁Q而不能将事务l箋(hu)下去的话Q就 出现死锁?br /> 如事?在表A行记?3中有一排它锁,q等待事?在表A中记?4 中排它锁的释放,而事?在表A记录?4中有一排它锁,q等待事?1在表A中记?3中排它锁的释放,事务1与事?彼此{待Q因此就?成了(jin)死锁。死锁一般是因拙劣的事务设计而?br /> <br /> <em style="font-size: 10pt; color: #c0c0c0">版权归原作者和各发布网站所有,此文章仅供学?fn)参考之?/em> <br /> <br /> <img src ="http://www.aygfsteel.com/imdosop/aggbug/239225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/imdosop/" target="_blank">東頭bing阉K</a> 2008-11-07 14:32 <a href="http://www.aygfsteel.com/imdosop/archive/2008/11/07/239225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库锁表原因分?lt;?gt;http://www.aygfsteel.com/imdosop/archive/2008/11/07/239207.html東頭bing阉K東頭bing阉KFri, 07 Nov 2008 03:34:00 GMThttp://www.aygfsteel.com/imdosop/archive/2008/11/07/239207.htmlhttp://www.aygfsteel.com/imdosop/comments/239207.htmlhttp://www.aygfsteel.com/imdosop/archive/2008/11/07/239207.html#Feedback0http://www.aygfsteel.com/imdosop/comments/commentRss/239207.htmlhttp://www.aygfsteel.com/imdosop/services/trackbacks/239207.html 当userA发出 select * from 表名 for update of 字段 ?
q是U录被锁住等待更?
当userB此时也发出select * from 表名 for update of 字段 ?
q且for update of 的纪录已l被userA锁定
q是userB只能{待userA提交后才能获取到userA被占用的U录
如果userA不提交userB׃(x)无限期的{待
解决Ҏ(gu)
userB执行select * from 表名 for update of 字段 no wait 10;
q时虽然U录被userA锁定但是userB?x)等?0U如?0U内userA释放
?jin)纪录,则userB获取该锁,如果10U后userA未释N,则userBq回
错误消息
ora-30006:资源已被占用;执行此操作时出现wait时

--------------------------------------------------------------------

userA锁住一条纪?
userB锁住一条纪?
userAh锁住userB正在锁住的纪?
而同时userBh锁住userA正在锁住的纪?
q时候就?x)生死?br />
--------------------------------------------------------------------

如果在事务中执行?jin)一条不满条g的update语句Q则执行全表扫描Q把行锁上升ؓ(f)表锁,多个q样的事务执行后Q就很容易生死锁?br />  
版权归原作者和各发布网站所有,此文章仅供学?fn)参考之?/em> 

東頭bing阉K 2008-11-07 11:34 发表评论
]]>
数据库锁表原因分?lt;一>http://www.aygfsteel.com/imdosop/archive/2008/11/06/239085.html東頭bing阉K東頭bing阉KThu, 06 Nov 2008 10:11:00 GMThttp://www.aygfsteel.com/imdosop/archive/2008/11/06/239085.htmlhttp://www.aygfsteel.com/imdosop/comments/239085.htmlhttp://www.aygfsteel.com/imdosop/archive/2008/11/06/239085.html#Feedback0http://www.aygfsteel.com/imdosop/comments/commentRss/239085.htmlhttp://www.aygfsteel.com/imdosop/services/trackbacks/239085.html 死锁产生的原?/strong>           
    在联Z务处理系l中Q造成L主要有两斚w原因。一斚wQ由于多用户、多d的ƈ发性和事务的完整性要求,当多个事务处理对多个资源同时讉KӞ若双方已锁定一部分资源但也都需要对方已锁定的资源时Q无法在有限的时间内完全获得所需的资源,׃(x)处于无限的等待状态,从而造成其对资源需求的死锁?nbsp;          
    另一斚wQ数据库本n加锁机制的实现方法不同,各数据库pȝ也会(x)产生其特D的死锁情况。如在Sybase       SQL Server 11中,最锁?K一늚加锁Ҏ(gu)Q而非行锁。如果某张表的记录数且记录的长度较?卌录密度高Q如应用pȝ中的pȝ配置表或pȝ参数表就属于此类?Q被讉K的频率高Q就Ҏ(gu)在该上产生死锁?br />          
Ҏ(gu)发生死锁的几U情况如?           
1>不同的存储过E、触发器、动态SQL语句D|照不同的序同时讉K多张?              
2>在交换期间添加记录频J的表,但在该表上用了(jin)非群集烦(ch)?non-clustered);              
3>表中的记录少Q且单条记录较短Q被讉K的频率较高;          
4>整张表被讉K的频率高(如代码对照表的查询等)?nbsp;          

以上死锁情况的对应处理方法如? 
       
1>在系l实现时应规定所有存储过E、触发器、动态SQL语句D中Q对多张表的操作L使用同一序。如Q有两个存储q程proc1、proc2Q都需要访问三张表zltab、z2tab和z3tabQ如果proc1按照zltab、z2tab和z3tab的顺序进行访问,那么Qproc2也应该按照以上顺序访问这三张表?nbsp;         
2>对在交换期间d记录频繁的表Q用群集烦(ch)?clustered)Q以减少多个用户d记录到该表的最后一上Q在表尾产生热点Q造成死锁。这c表多ؓ(f)往来̎的流水表Q其特点是在交换期间需要在表尾q加大量的记录,q且对已d的记录不做或较少做删除操作?nbsp;         
3>对单张表中记录数不太多,且在交换期间select或updata较频J的表可使用讄每页最大行的办法,减少数据在表中存攄密度Q模拟行U锁Q减在该表上死锁情늚发生。这c表多ؓ(f)信息J杂且记录条数少的表?br />            
如:(x)pȝ配置表或pȝ参数表。在定义该表时添加如下语句:(x)           
with   max_rows_per_page=1           
在存储过E、触发器、动态SQL语句D中Q若Ҏ(gu)些整张表select操作较频J,则可能在该表上与其他讉K该表的用户生死锁。对于检查̎h否存在,但被(g)查的字段在检查期间不?x)被更新{非关键语句Q可以采用在select命o(h)中用at       isolation       read       uncommitted子句的方法解冟뀂该Ҏ(gu)实际上降低了(jin)select语句Ҏ(gu)张表的锁U别Q提高(sh)(jin)其他用户对该表操作的q发性。在pȝ高负药行时Q该Ҏ(gu)的效果尤为显著?nbsp;          
如:(x)          
select * from titles at isolation read uncommitted          
Ҏ(gu)水号一cȝ序数生成器字段Q可以先执行updata水号字D?1Q然后再执行select获取水L(fng)Ҏ(gu)q行操作?br />
版权归原作者和各发布网站所有,此文章仅供学?fn)参考之?/em>  

東頭bing阉K 2008-11-06 18:11 发表评论
]]>
վ֩ģ壺 Һ| ȫ| ŷ| | ˮ| Ī| | Ӣ| ͨ| ־| | ׿| | ຣʡ| ͨ| | ʡ| ɰ| ̫| | | | | | ͬ| | | ӡ| ޻| ֬| | | Ϫ| | ڻ| | ɽ| | | ʲ| |