UPDATE 时, 如何避免数据定位处理被阻塞

原创 2006年09月17日 13:24:00

问题描述:

数据库PUBS中的authors表,想锁定CITYaaa的记录,为什么执行下面的命令后,CITYbbb的记录也被锁定了,无法进行UPDATE.

BEGIN TRANSACTION    

    SELECT * FROM authors

    WITH (HOLDLOCK)

    WHERE city='aaa'

如何才能锁定CITYAAA的记录,而且CITYBBB的记录依然能SELECTUPDATE

 

问题分析:

应该不是被锁住,应该只是检索数据的时候,需要从aaa的记录扫描到bbb的记录,而aaa被锁住了,所以扫描无法往下进行,这样看起来似乎就是bbb也被锁住了。

当然,也有可能确实是被锁住了,SQL Server的锁定默认是行级的,如果你的资源不足,则可能导致锁自动升级为页级甚至表级锁,这样会导致更多的记录被锁定。

使用下面的语句, 如果能读出数据, 则多半是第1种情况.

SELECT *

FROM authors WITH (READPAST)

WHERE city='bbb'

如果读不出数据, 则一般是第2种情况.

 

问题解决方法:

SELECT UPDATE 走不同的索引,这样在UPDATE 的时候,不用扫描已经锁定的数据就可以定义到记录,UPDATE 也就不会被阻塞了

指定索引用类似下面的语句:

SELECT *

FROM authors WITH (HOLDLOCK, INDEX=索引名)

WHERE city='aaa'

 

UPDATE A SET

    xx = xx

FROM authors A WITH (INDEX=索引名)

WHERE city='bbb'

当然,要保证仅扫描索引就可以定义到记录,否则可能还是会被阻塞。

 

 

补充

对于熟悉SQL Server锁的读者,可以通过 sp_lock,或者查询系统表 master.dbo.syslocksmaster.dbo.syslockinfo来确定行为。

svn update时 版本冲突问题解决

当我们和别人同时修改了文件,别人通过commit提交,我们再去update时,会出现版本冲突,如下所示: 解决方法: 1、  在冲突的文件上(选中文件--右键菜单—Tortoise...
  • framic
  • framic
  • 2016年09月01日 08:46
  • 359

使用阻塞式队列处理大数据

转自:http://blog.csdn.net/lifetragedy/article/details/50593588 前言 我们都知道,JAVA对于文本文件在读时是独占的,即使可以用多...
  • codershamo
  • codershamo
  • 2016年07月22日 22:37
  • 2806

使用阻塞式队列处理大数据

前言我们在日常开发中经常会有面对几十万、甚至上百万级别的数据导入导出的问题,如读一个含有50万行的TXT、CSV、EXCEL文件。此时我们经常想到的一个问题是如何利用多线程来解决数据处理效率的问题,如...
  • lifetragedy
  • lifetragedy
  • 2016年01月27日 16:00
  • 11623

1、connect方法会阻塞,请问有什么方法可以避免其长时间阻塞? 答:最通常的方法最有效的是加定时器;也可以采用非阻塞模式。 2、网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻知道? 答

1、connect方法会阻塞,请问有什么方法可以避免其长时间阻塞? 答:最通常的方法最有效的是加定时器;也可以采用非阻塞模式。 2、网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻知道?...
  • u011403897
  • u011403897
  • 2013年08月02日 17:10
  • 1591

socket中send和recv函数的阻塞理解

首先要理解的是,缓冲区有两种。第一种是用户定义的缓冲区,就是send里的缓冲区参数。另一种就是套接字缓冲区,是由协议自定的。可以用getsockopt获取其大小,并用setsockopt重置其大小。发...
  • dongdan_002
  • dongdan_002
  • 2014年10月16日 23:05
  • 1829

MYSQL的UPDATE子查询,UPDATE时避免使用子查询

UPDATE t_csi_comment SET is_valid = 0 WHERE         comment_id IN (                 SELECT     ...
  • dagailv
  • dagailv
  • 2017年05月29日 17:57
  • 711

MYSQL的UPDATE子查询,UPDATE时避免使用子查询

近日写mysql储存过程的时候,有个SQL执行不动: UPDATE t_csi_comment SET is_valid = 0 WHERE comment_id IN ( SELECT...
  • baobaohaishigehaizi
  • baobaohaishigehaizi
  • 2017年06月02日 09:28
  • 70

从头认识java-17.4 详解同步(4)-同步阻塞、synchronized和volatile

这一章节我们来介绍同步阻塞、synchronized和volatile。1.同步阻塞之前我们提到过synchronized放在同步方法上:public synchronized void transf...
  • raylee2007
  • raylee2007
  • 2016年01月13日 22:01
  • 2387

system函数的总结

最近在看APUE第10章中关于system函数的
  • astrotycoon
  • astrotycoon
  • 2014年10月30日 20:22
  • 2414

MYSQL的UPDATE子查询,UPDATE时避免使用子查询

近日写mysql储存过程的时候,有个SQL执行不动: UPDATE t_csi_comment SET is_valid = 0 WHERE         comment_id IN (...
  • cdssdfsdfsdfsdfsdfds
  • cdssdfsdfsdfsdfsdfds
  • 2017年05月31日 07:48
  • 89
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UPDATE 时, 如何避免数据定位处理被阻塞
举报原因:
原因补充:

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