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来确定行为。

对Oracle数据库表加行锁控制并发时重复交易

原文链接:http://juliana-only.iteye.com/blog/1233247 最近遇到一个比较棘手的问题,交易时出现重复交易,并且这个问题是偶尔才出现,公司的产品主要是针对...
  • duomoluo
  • duomoluo
  • 2016-07-27 09:35:36
  • 3637

关于使用FOR UPDATE引起阻塞的问题

 关于使用FOR UPDATE引起阻塞的问题请教我有一个存储过程完成以下操作1、select id,col1,con2 into v_id,v_col1,v_col2 from table1 wher...
  • flying_hawk
  • flying_hawk
  • 2009-01-14 08:58:00
  • 611

oracle执行update时卡死问题解决

oracle执行update时卡死问题解决   用sql进行更新数据库操作时,eclipse没有运行结束,也没有报错,debug时停留在执行sql语句的位置。用plsql developer 直接u...
  • kuailexiaozi1989
  • kuailexiaozi1989
  • 2017-05-31 08:58:43
  • 719

高并发update的 死锁产生原因

在说这个之前首先了解一下讲一下update语句sql中的情况。死锁产生的条件:出现循环等待资源。update对锁的流程:       当sql发出一个update请求之后,数据库会对表中的每条记录加上...
  • zc474235918
  • zc474235918
  • 2016-01-20 16:58:14
  • 14847

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

问题描述:数据库PUBS中的authors表,想锁定CITY为aaa的记录,为什么执行下面的命令后,CITY为bbb的记录也被锁定了,无法进行UPDATE.BEGIN TRANSACTION     ...
  • zjcxc
  • zjcxc
  • 2006-09-17 13:24:00
  • 6670

Select+Update并发处理

当一个会员想续买会员(只能续买1个月、3个月或6个月)时,必须满足以下业务要求: •如果end_at早于当前时间,则设置start_at为当前时间,end_at为当前时间加上续买的月数 •...
  • u011121287
  • u011121287
  • 2016-08-05 10:17:15
  • 3048

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

问题描述:数据库PUBS中的authors表,想锁定CITY为aaa的记录,为什么执行下面的命令后,CITY为bbb的记录也被锁定了,无法进行UPDATE.BEGIN TRANSACTION     ...
  • jackeyabc
  • jackeyabc
  • 2007-03-19 15:28:00
  • 653

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

问题描述:数据库PUBS中的authors表,想锁定CITY为aaa的记录,为什么执行下面的命令后,CITY为bbb的记录也被锁定了,无法进行UPDATE.BEGIN TRANSACTION     ...
  • huangkelong
  • huangkelong
  • 2008-01-03 14:40:00
  • 159

探讨SQL Server并发处理存在就更新七种解决方案

探讨SQL Server并发处理存在就更新七种解决方案 前言 本节我们来讲讲并发中最常见的情况存在即更新,在并发中若未存在行记录则插入,此时未处理好极容易出现插入重复键情况,本...
  • xxdddail
  • xxdddail
  • 2017-06-01 08:54:37
  • 658

C# 阻塞方式Socket接受异常处理(不定期更新)

经过多次网上资料的查询和同事的探讨;解决了一个很常见很基础的问题,再次记录下;希望能帮助到新人; 问题: 阻塞方式Socket下,接受数据异常处理: 异常:关闭发送客户端; 解决:这类问题只需要一个t...
  • iceagezh
  • iceagezh
  • 2017-04-19 13:25:57
  • 1947
收藏助手
不良信息举报
您举报文章:UPDATE 时, 如何避免数据定位处理被阻塞
举报原因:
原因补充:

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