数据库阻塞

转载 2011年01月11日 10:27:00

如果一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞(blocking)。这样一来,请求的会话会被阻塞,它会“挂起”,直至持有锁的会话放弃锁定的资源。几乎在所有情况下,阻塞都是可以避免的。实际上,如果你真的发现会话在一个交互式应用中被阻塞,就说明很有可能同时存在着另一个bug,即丢失更新,只不过你可能没有意识到这一点。也就是说,你的应用逻辑有问题,这才是阻塞的根源。

数据库中有5条常见的DML语句可能会阻塞,具体是:INSERT、UPDATE、DELETE、MERGE和SELECT FOR UPDATE。对于一个阻塞的SELECT FOR UPDATE,解决方案很简单:只需增加NOWAIT子句,它就不会阻塞了。这样一来, 你的应用会向最终用户报告,这一行已经锁定。另外4条DML语句才有意思。我们会分别分析这些DML语句,看看它们为什么不应阻塞,如果真的阻塞了又该如何修正。


阻塞的MergeUpdateDelete

在一个交互式应用中,可以从数据库查询某个数据,允许最终用户处理这个数据,再把它“放回”到数据库中,此时如果UPDATE或DELETE阻塞,就说明你的代码中可能存在一个丢失更新问题(如果真是这样,按我的说法,就是你的代码中存在bug)。你试图UPDATE(更新)其他人正在更新的行(换句话说,有人已经锁住了这一行)。通过使用SELECT FOR UPDATE NOWAIT查询可以避免这个问题,这个查询能做到:

q  验证自从你查询数据之后数据未被修改(防止丢失更新)。

q  锁住行(防止UPDATE或DELETE被阻塞)。

如前所述,不论采用哪一种锁定方法都可以这样做。不论是悲观锁定还是乐观锁定都可以利用SELECT FOR UPDATE NOWAIT查询来验证行未被修改。悲观锁定会在用户有意修改数据那一刻使用这条语句。乐观锁定则在即将在数据库中更新数据时使用这条语句。这样不仅能解决应用中的阻塞问题,还可以修正数据完整性问题。

由于MERGE只是INSERT和UPDATE(如果在10g中采用改进的MERGE语法,还可以是DELETE),所以可以同时使用这两种技术。

该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束为止。

数据库阻塞和死锁的区别

数据库阻塞和死锁在程序开发过程经常出现,怎么样避免呢?下面通过Demo简单模拟下,数据库发生阻塞和死锁的现象: 一、数据库阻塞:     数据库阻塞的现象:第一个连接占有资源没有释放,而第二个连接...
  • ha196200
  • ha196200
  • 2015年04月10日 22:10
  • 2765

数据库死锁 和 阻塞

数据库死锁原因及解决办法 死锁(Deadlock) 所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 此时称...
  • firefly_2002
  • firefly_2002
  • 2012年09月22日 18:57
  • 5205

MSSQL如何查看阻塞的进程

/* Script: CH06 Blocking Script2.SQL Author: James Rowland-Jones Title: Professional SQL Server 200...
  • c_enhui
  • c_enhui
  • 2014年07月03日 13:47
  • 1686

查询当前数据库是否存在阻塞的情况

select s1.inst_id, sl.username blkg_user, sl.machine blkg_ws, s1.sid b...
  • cheng564943797
  • cheng564943797
  • 2016年03月03日 15:15
  • 235

数据库读或写的互相阻塞

Oracle里面,一个transaction的读会阻塞其他连接的写操作,但是反之写并不会阻塞读操作 SQLServer里面,一个transaction的写会阻塞其他连接的读/写操作,但是反之读并不会...
  • wwwcomy
  • wwwcomy
  • 2015年10月13日 15:06
  • 708

数据库锁表及阻塞的原因和解决办法

问题说明 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重...
  • weixin_38756990
  • weixin_38756990
  • 2017年06月04日 00:21
  • 795

SqlServer中——查找杀死阻塞进程

查找阻塞进程: SELECT blocking_session_id '阻塞进程的ID', wait_duration_ms '等待时间(毫秒)', session_id '(会话ID)' FROM...
  • shuai7boy
  • shuai7boy
  • 2016年11月17日 17:23
  • 693

C3P0数据库连接池因网络阻塞出现的问题

我手上有一个短信发送的系统,每天发送量大约3万的样子,有天突然崩溃,看到数据库连接池一直在报错,很慌乱的重启了系统,没用效果.之前选择数据库连接池时,看hibernate推荐c3p0,就下载了最新的版...
  • eternalfig
  • eternalfig
  • 2009年04月14日 13:59
  • 1456

数据库阻塞和死锁

    数据库阻塞和死锁在程序开发过程经常出现,怎么样避免呢?下面通过Demo简单模拟下,数据库发生阻塞和死锁的现象:一、数据库阻塞:    数据库阻塞的现象:第一个连接占有资源没有释放,而第二个连接...
  • ojuju10
  • ojuju10
  • 2009年09月27日 15:17
  • 3321

接口获取数据库连接阻塞问题

问题描述 接口URL:http://192.168.10.200:20200/h5-customer/customer/card/consumerCard/submit?cardId=card_20...
  • sunye0715
  • sunye0715
  • 2017年10月26日 11:38
  • 186
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库阻塞
举报原因:
原因补充:

(最多只允许输入30个字)