sql 查询-更新 阻塞。。。。?

金大哈 2009-10-12 04:54:03
遇到的现象是 同一个表的query会阻塞update

sql query 和update 操作 query会阻塞update操作吗

怎么解决

是不是什么设置不对还是怎的


如果会的话,那同一个表的频繁query and update 那数据库不阻塞的不像样子啊


求解
...全文
112 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
-狙击手- 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wzy_love_sly 的回复:]
引用 8 楼 xman_78tom 的回复:
select 查询操作会在资源(表、行或索引键)上设置共享锁(S 锁)。
update 更新操作会在资源(表、行或索引键)上设置排他锁(X 锁)。
由于 S 锁与 X 锁不兼容,因此 S 锁会阻止 update 操作获取资源的 X 锁,反之亦然。



read committe和read_committed_snapshot off下
select 有时候会加is锁,斜了


[/Quote]

真的是斜了
ws_hgo 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wzy_love_sly 的回复:]
引用 8 楼 xman_78tom 的回复:
select 查询操作会在资源(表、行或索引键)上设置共享锁(S 锁)。
update 更新操作会在资源(表、行或索引键)上设置排他锁(X 锁)。
由于 S 锁与 X 锁不兼容,因此 S 锁会阻止 update 操作获取资源的 X 锁,反之亦然。



read committe和read_committed_snapshot off下
select 有时候会加is锁,斜了


[/Quote]
拜见大大
wzy_love_sly 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xman_78tom 的回复:]
select 查询操作会在资源(表、行或索引键)上设置共享锁(S 锁)。
update 更新操作会在资源(表、行或索引键)上设置排他锁(X 锁)。
由于 S 锁与 X 锁不兼容,因此 S 锁会阻止 update 操作获取资源的 X 锁,反之亦然。
[/Quote]


read committe和read_committed_snapshot off下
select 有时候会加is锁,斜了

weixiao51 2009-10-12
  • 打赏
  • 举报
回复
频繁读写可以使用快照数据库, 读写分离日志同步
xman_78tom 2009-10-12
  • 打赏
  • 举报
回复
select 查询操作会在资源(表、行或索引键)上设置共享锁(S 锁)。
update 更新操作会在资源(表、行或索引键)上设置排他锁(X 锁)。
由于 S 锁与 X 锁不兼容,因此 S 锁会阻止 update 操作获取资源的 X 锁,反之亦然。

至于是否会频繁、大范围的发生阻塞,这要看采取何种并发控制,事务的隔离等级等等。一般来说,在默认的读已提交隔离等级下,select 操作读取数据后即释放 S 锁,因此不会长时间阻塞 update 操作对该数据的更新。

具体的数据锁机制,并发控制,事务隔离等级等内容相当多和复杂,不是几句就可以说完的。继续学习吧,共勉。
ws_hgo 2009-10-12
  • 打赏
  • 举报
回复
你看下2楼的
ws_hgo 2009-10-12
  • 打赏
  • 举报
回复
就是锁的问题
--小F-- 2009-10-12
  • 打赏
  • 举报
回复
华夏小卒 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fredrickhu 的回复:]
不明白什么意思
[/Quote].
--小F-- 2009-10-12
  • 打赏
  • 举报
回复
不明白什么意思
dawugui 2009-10-12
  • 打赏
  • 举报
回复
1 如何锁一个表的某一行

A 连接中执行

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

begin tran

select * from tablename with (rowlock) where id=3

waitfor delay '00:00:05'

commit tran

B连接中如果执行

update tablename set colname='10' where id=3 --则要等待5秒

update tablename set colname='10' where id<>3 --可立即执行

2 锁定数据库的一个表

SELECT * FROM table WITH (HOLDLOCK)


注意: 锁定数据库的一个表的区别

SELECT * FROM table WITH (HOLDLOCK)
其他事务可以读取表,但不能更新删除

SELECT * FROM table WITH (TABLOCKX)
其他事务不能读取表,更新和删除



排他锁
http://topic.csdn.net/u/20080425/10/a1d7d337-a918-4c8c-ba97-44ae4472ade4.html?1527885039
guguda2008 2009-10-12
  • 打赏
  • 举报
回复
学习,帮顶,最好描述一下具体业务

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧