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

相关文章推荐

Laravel中chunk方法分块处理数据,update需注意

在一些情况下,我们需要对大批量的数据进行操作,如果这个时候我们使用foreach的话,很可能会遇到操作超时的情况。在Laravel框架中我们可以很方便的使用chunk方法来解决。来看一个简单的例子:$...

(尚硅谷) Orcale 数据处理DML(INSERT/DELETE/UPDATE) DCL :COMMOT ROLLBACK SAVE

第8节数据处理DML(INSERT/DELETE/UPDATE) DCL :COMMOT ROLLBACK SAVEPOINT --1添加 inert create table emp ( ...

jpa2.1配置多个数据源和事务及Executing an update/delete query异常处理

项目中需要连接2个数据库,配置完成后发现第二个事务不起作用,折腾了2天终于找到了原因,下面把解决步骤记录下来,方便自己以后和需要的朋友查看: 首先按照下面方法配置2个数据源并且配置好persiste...
  • yulsh
  • yulsh
  • 2017年02月22日 17:19
  • 194

SQL——处理数据(INSERT、DELETE、UPDATE)

1.SQL语句的分类 数据操作语句:DML语句(Data Manipulation Language),包括insert、update、delete。 数据查询语句:DQL语句(Data Query ...

Hibernate数据关联映射出现Could not execute JDBC batch update的异常处理

Hibernate数据关联映射出现Could not execute JDBC batch update的异常处理该异常是在创建多对多映射时出现的,当时考虑创建老师表和学生表,老师和学生的关系符合多对...

MySQL插入数据时,如果记录不存在则insert,如果存在则update

MySQL 当记录不存在时insert,当记录存在时更新 网上基本有三种解决方法。 第一种: 示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使...

C#连接Access数据库,Update更新数据时出现“不能打开数据库,应用程序可能无法识别该数据库。。。”错误

在使用C#的oledb连接Access数据库时,使用事务来对数据库进行数据增加和修改,前面的insert语句都可以正常执行,而到Update更新表格数据时,程序出现了“不能打开数据库,应用程序可能无法...

处理死锁 阻塞问题预备知识之SELECT,UPDATE,DELETE操作需要申请的锁(一 SELECT操作)

--常见SELECT操作要申请的锁   --查看当前数据库的版本信息:   print @@version /* Microsoft SQL Server 2008 (RTM) - 1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UPDATE 时, 如何避免数据定位处理被阻塞
举报原因:
原因补充:

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