###如何设置对表的独占操作,以及如何获取表是否被独占的状态?###

nik_Amis 2008-03-12 05:39:48
有数据表A,用户X在SELECT ,UPDATE等 A的记录之前,设置对A的独占方式打开,此时任何其他用户在对这张表访问之前会先询问是否已经被独占打开,若独占打开则不能作任何操作,X操作结束之后取消独占,其他用户才可以访问此表

1。设置独占打开一张表
2。获取表的状态

请问各位高手,SQL 里面是否有这样的语句?
...全文
339 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
hui_hui_2007 2008-04-07
  • 打赏
  • 举报
回复
关注
nik_Amis 2008-04-07
  • 打赏
  • 举报
回复
up
nik_Amis 2008-03-18
  • 打赏
  • 举报
回复
up
rouqu 2008-03-13
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 nik_Amis 的回复:]
我的需求是这样的:

A用户每天要对表P做查询更新插入数次,数据量每次最少2000条,最多可能10万
在更新期间不允许其他任何用户访问该表

大家看看,除了我上面的解决方案还有别的什么好的办法么?
[/Quote]

按照系统设计 表P做更新插入期间 其他用户可以访问表未被更新的记录行 为什么你不让访问呢?
rouqu 2008-03-13
  • 打赏
  • 举报
回复
你用条件判断应该说效果有限 因为你去判断什么级别(TAB、PAG、RID)上的什么锁(S/IS/U/IX/X)呢?

判断TAB意义不大(TAB为X的情况很少 大多数IX/S 你判断之后怎么操作?) 判断PAG也是(你怎么得到当前要更新的表范围对应的PAG并和当前锁定的PAG做比较)

如果你判断通过 系统可能还会判断一遍 如果你判断不通过 实际上可能无并发问题
rouqu 2008-03-13
  • 打赏
  • 举报
回复
Method I
set transaction isolation level serialiable

begin tran
select * from tableP

insert/update...

commit tran

set选项设置对当前连接所有SELECT一直启效 在查询更新插入操作完成之前 表被锁定(Select之后S锁不释放)

nik_Amis 2008-03-13
  • 打赏
  • 举报
回复
我的需求是这样的:

A用户每天要对表P做查询更新插入数次,数据量每次最少2000条,最多可能10万
在更新期间不允许其他任何用户访问该表

大家看看,除了我上面的解决方案还有别的什么好的办法么?
nik_Amis 2008-03-13
  • 打赏
  • 举报
回复
为啥意义不大?
rouqu 2008-03-13
  • 打赏
  • 举报
回复
BOL中不是有Result Sets嘛 LZ 不是我说 你这个程序做出来了意义也不大


netcup 2008-03-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 happyflystone 的回复:]
11楼来解释 呀
[/Quote]
就是update table set pkid=pkid where pkid=@id
这样也可以起到锁表的作用。
rouqu 2008-03-13
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 nik_Amis 的回复:]
有没有办法不用SP_LOCK取得锁定表?


这玩意儿,没法加查询条件,要在程序里面逐条判断,很不爽的
[/Quote]
insert into ... exec sp_lock
nik_Amis 2008-03-13
  • 打赏
  • 举报
回复
没人知道?

nik_Amis 2008-03-13
  • 打赏
  • 举报
回复
有没有办法不用SP_LOCK取得锁定表?


这玩意儿,没法加查询条件,要在程序里面逐条判断,很不爽的
ojuju10 2008-03-13
  • 打赏
  • 举报
回复
对表进行锁定
nik_Amis 2008-03-13
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 rouqu 的回复:]
引用 32 楼 tongki_8 的回复:
楼主想法有问题

没错 LZ似乎认为数据库就应该在单用户状态下使用
[/Quote]

晕倒。。。
rouqu 2008-03-13
  • 打赏
  • 举报
回复
11F的方法是另外建立一张表 专门维护已被锁定表的状况吗?
yanjinbin01 2008-03-13
  • 打赏
  • 举报
回复
To :34楼
这种想法没什么问题,有时候你也会遇到 需要阻塞其他操作,让他们排队 而不是并发.(丢失性能是一定的但要的就是这效果.)
yanjinbin01 2008-03-13
  • 打赏
  • 举报
回复
维护数据完整行.
从你的需求来说
1.事务解决不可靠的(事务是行级锁定,对你这根本不使用)
2.12楼做标记方法,是可以的(用存储过程实现,一条sql语句实现不了,标记用全局变量@@xxx)
-- 并发问题,这里要自己定义一个循环+标记 来阻塞,等上次操作完下面的操作才能开发.
3.锁定表也是可行的(存储过程实现,一条sql语句实现不了.lock table unlock table )
总的来说这个.
-- 这个没问题,在mysql(sql server里面我不太清楚)里面锁定表后 并发操作会自动等前面解锁后在操作.


rouqu 2008-03-13
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 tongki_8 的回复:]
楼主想法有问题
[/Quote]
没错 LZ似乎认为数据库就应该在单用户状态下使用
rouqu 2008-03-13
  • 打赏
  • 举报
回复
update/insert进行过程中 对应记录S锁不能加 也即是处于pengding的状态

加载更多回复(22)

34,594

社区成员

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

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