数据库阻塞

转载 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语句结束为止。

相关文章推荐

捕获数据库阻塞情况

  • 2015年06月29日 21:55
  • 2KB
  • 下载

如何查看数据库中的死锁、阻塞!

前面说了“手动释放oracle数据库中死锁的对象锁!” 这里再来进一步的记录详细一点! 首先打开一个session1会话 SQL> conn u1/u1 已连接。 SQL> sho...

查看数据库阻塞

--创建递归查询数据库的阻塞 WITH CTE_TABLE(session_id,wait_type,blocking_session_id,resource_type,DATABASE_NAME,...

用Arduino监测MSSQL数据库中进程阻塞情况

有天开了个脑洞然后又把它填上了,做了一个监测公司在用的MSSQL数据库的进程阻塞情况,用一两杯星爸爸的价格干一台PC的活老板你总开心了吧。...
  • ki1381
  • ki1381
  • 2017年05月25日 07:52
  • 224

SQL SERVER性能分析--死锁检测数据库阻塞语句

工作中数据库经常出错死锁,并且还要要求解决当前的死锁,问题多多; 参照CSDN,中国风(Roy)一篇死锁文章并改进了下; /************************************...

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

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

sql server性能分析--检测数据库阻塞语句

create PROCEDURE [dbo].[auto_checkblocks] AS set nocount on if exists ( select * from master..sysp...
  • bobwu
  • bobwu
  • 2011年12月14日 18:25
  • 562

SQL SERVER性能分析--死锁检测数据库阻塞语句 .

/***************************************************************************************************...

Spring + hibernate 更新数据库阻塞

用SSH开发程序的时候,遇到一个怪问题。 因为程序处理分为多部分,每一部处理完后,要更新处理状态表的状态字段。 更新程序采用hibernate的update方法,在Spring中,利用AOP加上了...

问题8:数据库innodb锁和阻塞信息查看

关系数据库是并发系统,满足ACID要求,锁是实现该特性的一项技术。锁的类型有共享锁和排它锁。共享锁是相互不阻塞,在同一个时间可以并发,例如select读操作。排它锁会相互阻塞写操作,理论上不阻塞读操作...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库阻塞
举报原因:
原因补充:

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