有没有一种锁,可以锁行,并且不允许其他事务访问?

renzhm 2009-04-03 04:26:56
问题如题,就是select * from ttt where id=1后,其他事务就不可以访问这一条数据,需要等待

本事务结束后,释放锁后,再访问,可以实现么?

我是要解决一个库存校验的问题,多人并发,检查库存,可能都满足数量要求,但保存后就可能有的已经超出库存了,

所以我想在校验库存时锁住行,让并发的其他事务等候,等当前事务结束后,其他并发再抢,可以实现么?
...全文
570 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxue_331 2012-05-01
  • 打赏
  • 举报
回复
此处技术大牛很多,但是似乎没人理解楼主具体的需求,就是只锁定特定的行。有完整的例子吗
fcbelieve 2009-07-31
  • 打赏
  • 举报
回复
你可以看看事物锁。。
soft_wsx 2009-07-31
  • 打赏
  • 举报
回复
--用ROWLOCK
zjybushiren88888 2009-07-31
  • 打赏
  • 举报
回复
..学习学习.
fuxiaoyang13 2009-07-31
  • 打赏
  • 举报
回复
我们也有这类要求,我们每个月的工资发放完后,就要锁定这个月的工资数据不让修改,工资表的主键是年月和工号,该如何实现呢?
hery2002 2009-07-31
  • 打赏
  • 举报
回复
..
cxmcxm 2009-07-30
  • 打赏
  • 举报
回复
将事务隔离级别设为可重复读
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
feixianxxx 2009-07-30
  • 打赏
  • 举报
回复
--如何锁一个表的某一行 

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT * FROM table ROWLOCK WHERE id = 1
zzz1975 2009-07-30
  • 打赏
  • 举报
回复
l
zwzw911 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 flowingdream 的回复:]
begin tran
select * from tbl with(updlock) where id=1

update tbl set Content='1_1112' where ID=3

commit tran

发现 id=3的数据的Content内容一样被改了
[/Quote]

测试语句些错了,select和update在同一个事务中,是一个进程,当然是update能成功了。
应该是在SSMS中新建一个查询,输入begin tran
select * from tbl with(updlock) where id=1,注意不要commit或者rollback
然后在新开一个查询窗口,输入 update tbl set Content='1_1112' where ID=3,此时会发现update在等待。
这才是模拟两个并发的做法
cqq_chen 2009-07-20
  • 打赏
  • 举报
回复
学习!
slund 2009-07-20
  • 打赏
  • 举报
回复
用updlock锁行。
flowingdream 2009-07-20
  • 打赏
  • 举报
回复
begin tran
select * from tbl with(updlock) where id=1

update tbl set Content='1_1112' where ID=3

commit tran

发现 id=3的数据的Content内容一样被改了
renzhm 2009-04-15
  • 打赏
  • 举报
回复
还是没有解决我的问题,with(xlock,paglock) 把整个表都锁了,对于不是当前仓库的库存校验岂不是也得等,这个并发率很高,
orochi_gao 2009-04-15
  • 打赏
  • 举报
回复
但话又说回来,这种隔离级别对高并发频繁更新的数据库来说性能很可能是瓶颈。
orochi_gao 2009-04-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 renzhm 的帖子:]
问题如题,就是select * from ttt where id=1后,其他事务就不可以访问这一条数据,需要等待

本事务结束后,释放锁后,再访问,可以实现么?

我是要解决一个库存校验的问题,多人并发,检查库存,可能都满足数量要求,但保存后就可能有的已经超出库存了,

所以我想在校验库存时锁住行,让并发的其他事务等候,等当前事务结束后,其他并发再抢,可以实现么?
[/Quote]
lz这种需求只是要求避免未提交读和幻影.可重复读是不影响你的设计的。只要保证事务依次进行就可以了,可以把隔离级别设成可串行化。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

看看例子吧
conn1:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN ttt
update account set username='sdfdf' where userid=1;
waitfor delay '00:00:20'
commit tran ttt
conn2:
select * from account where userid=1;
需要等待conn1完成后conn2才能读取

conn1:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN ttt
select * from account where userid=1;
waitfor delay '00:00:20'
commit tran ttt
conn2:
update account set username='sdfdf' where userid=1;
需要等待conn1完成后conn2才能修改

conn1:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN ttt
select * from account where userid=1;
waitfor delay '00:00:20'
commit tran ttt
conn2:
insert into account(userid,username) values(2,'fafdsafasd')
需要等待conn1完成后conn2才能插入。

沪上韩老大 2009-04-04
  • 打赏
  • 举报
回复
select * from t1 with(uplock) where id=1
健者天行 2009-04-04
  • 打赏
  • 举报
回复
学习
-狙击手- 2009-04-03
  • 打赏
  • 举报
回复
。。
-狙击手- 2009-04-03
  • 打赏
  • 举报
回复
。。
加载更多回复(8)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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