SQL SERVER 先update后select如何加行锁 ?

Mr Dang 2018-10-12 05:22:44
一个会话中先update怎么加行锁直到更新完,另一会话中select才会返回? 避免select读取到update前的数据 .请给出代码,谢谢
...全文
648 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2018-10-15
  • 打赏
  • 举报
回复
加上持续锁就行了,在05之后的版本,SQL行锁都是默认行为,可以不用指定
--窗口1
USE Test
GO
BEGIN TRAN
UPDATE Tab1 WITH(HOLDLOCK) SET Name='xxxx' WHERE ID=3

ROLLBACK TRAN

--窗口2
USE Test
GO
BEGIN TRAN

SELECT * FROM dbo.Tab1 WHERE ID=3

ROLLBACK
吉普赛的歌 2018-10-15
  • 打赏
  • 举报
回复
一般 update 不需要那么长时间。 另外, 你考虑那么多一般情况下根本没什么用处。 如果是给用户看的, 难道早10ms, 和晚 10ms 看到的结果不一致, 就有那么大的影响? 数据库本身就是经常变动的, 过于苛求事务只能让数据库慢如蜗牛。 当然, 极端情况也有可能, 但你得先说清楚你的场景, 说明到底什么情况下有这样的需求??
Mr Dang 2018-10-15
  • 打赏
  • 举报
回复
引用 3 楼 二月十六 的回复:
[quote=引用 2 楼 a295281315 的回复:]
[quote=引用 1 楼 二月十六 的回复:]在第一个连接中执行以下语句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
select * from table1
where B='b2'
commit tran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒
update执行完了30秒没到,select会返回?还是update后面是固定延时30秒,select才返回?[/quote]
动手试一下……先执行update,select会等待update执行完成才执行[/quote]就是单独update也要固定等待30秒才返回,这样不行,太慢了
二月十六 2018-10-13
  • 打赏
  • 举报
回复
引用 2 楼 a295281315 的回复:
[quote=引用 1 楼 二月十六 的回复:]在第一个连接中执行以下语句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
select * from table1
where B='b2'
commit tran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒
update执行完了30秒没到,select会返回?还是update后面是固定延时30秒,select才返回?[/quote]
动手试一下……先执行update,select会等待update执行完成才执行
Mr Dang 2018-10-12
  • 打赏
  • 举报
回复
引用 1 楼 二月十六 的回复:
在第一个连接中执行以下语句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
select * from table1
where B='b2'
commit tran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒
update执行完了30秒没到,select会返回?还是update后面是固定延时30秒,select才返回?
二月十六 2018-10-12
  • 打赏
  • 举报
回复
在第一个连接中执行以下语句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
select * from table1
where B='b2'
commit tran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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