UPDATE 时, 如何避免数据定位处理被阻塞
2007-03-19 15:28
447 查看
问题描述:
数据库PUBS中的authors表,想锁定CITY为aaa的记录,为什么执行下面的命令后,CITY为bbb的记录也被锁定了,无法进行UPDATE.
[align=left]BEGIN TRANSACTION [/align]
[align=left] SELECT * FROM authors [/align]
[align=left] WITH (HOLDLOCK) [/align]
[align=left] WHERE city='aaa' [/align]
如何才能锁定CITY为AAA的记录,而且CITY为BBB的记录依然能SELECT和UPDATE?
问题分析:
应该不是被锁住,应该只是检索数据的时候,需要从aaa的记录扫描到bbb的记录,而aaa被锁住了,所以扫描无法往下进行,这样看起来似乎就是bbb也被锁住了。
当然,也有可能确实是被锁住了,SQL Server的锁定默认是行级的,如果你的资源不足,则可能导致锁自动升级为页级甚至表级锁,这样会导致更多的记录被锁定。
使用下面的语句, 如果能读出数据, 则多半是第1种情况.
[align=left]SELECT * [/align]
[align=left]FROM authors WITH (READPAST) [/align]
WHERE city='bbb'
如果读不出数据, 则一般是第2种情况.
问题解决方法:
[align=left]让SELECT和UPDATE走不同的索引,这样在UPDATE的时候,不用扫描已经锁定的数据就可以定义到记录,UPDATE也就不会被阻塞了[/align]
[align=left]指定索引用类似下面的语句:[/align]
[align=left]SELECT * [/align]
[align=left]FROM authors WITH (HOLDLOCK, INDEX=索引名)[/align]
[align=left]WHERE city='aaa'[/align]
[align=left] [/align]
[align=left]UPDATE A SET [/align]
[align=left] xx = xx[/align]
[align=left]FROM authors A WITH (INDEX=索引名)[/align]
[align=left]WHERE city='bbb'[/align]
当然,要保证仅扫描索引就可以定义到记录,否则可能还是会被阻塞。
补充
[align=left]对于熟悉SQL Server锁的读者,可以通过 sp_lock,或者查询系统表 master.dbo.syslocks、master.dbo.syslockinfo来确定行为。[/align]
数据库PUBS中的authors表,想锁定CITY为aaa的记录,为什么执行下面的命令后,CITY为bbb的记录也被锁定了,无法进行UPDATE.
[align=left]BEGIN TRANSACTION [/align]
[align=left] SELECT * FROM authors [/align]
[align=left] WITH (HOLDLOCK) [/align]
[align=left] WHERE city='aaa' [/align]
如何才能锁定CITY为AAA的记录,而且CITY为BBB的记录依然能SELECT和UPDATE?
问题分析:
应该不是被锁住,应该只是检索数据的时候,需要从aaa的记录扫描到bbb的记录,而aaa被锁住了,所以扫描无法往下进行,这样看起来似乎就是bbb也被锁住了。
当然,也有可能确实是被锁住了,SQL Server的锁定默认是行级的,如果你的资源不足,则可能导致锁自动升级为页级甚至表级锁,这样会导致更多的记录被锁定。
使用下面的语句, 如果能读出数据, 则多半是第1种情况.
[align=left]SELECT * [/align]
[align=left]FROM authors WITH (READPAST) [/align]
WHERE city='bbb'
如果读不出数据, 则一般是第2种情况.
问题解决方法:
[align=left]让SELECT和UPDATE走不同的索引,这样在UPDATE的时候,不用扫描已经锁定的数据就可以定义到记录,UPDATE也就不会被阻塞了[/align]
[align=left]指定索引用类似下面的语句:[/align]
[align=left]SELECT * [/align]
[align=left]FROM authors WITH (HOLDLOCK, INDEX=索引名)[/align]
[align=left]WHERE city='aaa'[/align]
[align=left] [/align]
[align=left]UPDATE A SET [/align]
[align=left] xx = xx[/align]
[align=left]FROM authors A WITH (INDEX=索引名)[/align]
[align=left]WHERE city='bbb'[/align]
当然,要保证仅扫描索引就可以定义到记录,否则可能还是会被阻塞。
补充
[align=left]对于熟悉SQL Server锁的读者,可以通过 sp_lock,或者查询系统表 master.dbo.syslocks、master.dbo.syslockinfo来确定行为。[/align]
相关文章推荐
- UPDATE 时, 如何避免数据定位处理被阻塞
- UPDATE 时, 如何避免数据定位处理被阻塞
- UPDATE 时, 如何避免数据定位处理被阻塞
- UPDATE 时, 如何避免数据定位处理被阻塞
- UPDATE 时, 如何避免数据定位处理被阻塞
- UPDATE 时, 如何避免数据定位处理被阻塞
- UPDATE 时, 如何避免数据定位处理被阻塞
- UPDATE 时, 如何避免数据定位处理被阻塞
- UPDATE 时, 如何避免数据定位处理被阻塞
- 转:邹建--UPDATE 时, 如何避免数据定位处理被阻塞
- UPDATE 时, 如何避免数据定位处理被阻塞
- UPDATE 时, 如何避免数据定位处理被阻塞
- UPDATE 时, 如何避免数据定位处理被阻塞
- UPDATE 时, 如何避免数据定位处理被阻塞
- [大数据处理]-如何用消息系统避免分布式事务?
- php socket 处理不过来数据流,该如何避免(好像是阻塞了)
- DB2数据库HANG住的时候应该收集什么数据以及如何处理
- Ⅰ.18.1 如何存储和定位共享脚本和共享数据
- 如何在JavaScript中处理大量数据javascript
- easyui datetimebox处理【前台传递到后台是string类型,但是后台定义的是java.util.date,如何自动转换数据类型】