记录锁定问题

arclala 2003-03-18 08:45:01
在读取表的某一行记录时,锁定这一行,直到我更新了这行的记录后再解锁,不知怎样实现?
...全文
46 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
enhydraboy 2003-03-20
  • 打赏
  • 举报
回复
TO w_rose(w_rose):你的方法可行么,能不能把你的方法说详细点,最好给例子。
black_snail 2003-03-19
  • 打赏
  • 举报
回复
good explanation . looks more complicated than Oracle
enhydraboy 2003-03-18
  • 打赏
  • 举报
回复
需要先设定锁的隔离级别。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

说明如下:
有一个表的数据如下
c1 c2
----------- ------------------------
1 2003-01-08 12:00:00.000
2 2003-01-08 12:00:00.000
3 2003-01-08 12:00:00.000

在SQL Query Analyzer中开两个窗口(相当于两个连接)
1 窗口A中顺序执行

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
select * from t3 where c1=1 --此时已经锁定了该行

2 在窗口B中顺序执行

select * from t3 -可以得到结果

update t3 set c2='2003-1-8 12:00:00' where c1=1 --将会等待直到A释放行锁

3 在窗口A中顺序执行

commit tran --释放行锁,B的更新将被提交

根据楼主的意思,需求是:行锁,并且在查询时就锁住,而不是更新时,所以选择Reapeatable read是最合适的。

顺便说一句,采用表级锁,也可以,但是并发程度太低,所以应只在必要时才使用该选项。

BOL的说明:
SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE
}

REPEATABLE READ

锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。

SERIALIZABLE

在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
happydreamer 2003-03-18
  • 打赏
  • 举报
回复
在第一个连接中执行以下语句
begin tran
select * from table1 holdlock -holdlock人为加锁
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran

在第二个连接中执行以下语句
begin tran
select A,C from table1
where B='b2'
update table1
set A='aa'
where B='b2'
commit tran

若同时执行上述两个语句,则第二个连接中的select查询可以执行
而update必须等待第一个连接中的共享锁结束后才能执行 即要等待30秒
Rewiah 2003-03-18
  • 打赏
  • 举报
回复
BEGIN TRANSACTION

SELECT ... FROM tablename WITH (XLOCK) where ...
update tablename ...
commit TRANSACTION

w_rose 2003-03-18
  • 打赏
  • 举报
回复
不要给自己找麻烦,使用一个字段作为标志,使用触发器做约束。

22,209

社区成员

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

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