请问如何让一个SQL Server2000的存储过程不可重入,即如果有任何进程在执行时,其它进程只能排队等候

shenxin 2001-12-04 08:27:22
...全文
202 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanghuan 2001-12-12
  • 打赏
  • 举报
回复
如果使用了排他锁,就会阻止其他事务到本事务完成为止,
与问题本事要求的有偏差,他只是想存储过程串行执行,
不是把事务的并行性降低
panther_totem 2001-12-12
  • 打赏
  • 举报
回复
to:everyone
朋友多多--〉miaoxg@163.com
bluepower2008 2001-12-12
  • 打赏
  • 举报
回复
to : shenxin(木头) 
可以,在数据库版块,大家就是朋友。
我的邮箱是bluepower2008@163.com
流星尔 2001-12-12
  • 打赏
  • 举报
回复
to shenxin(木头):
我也刚学不就,咱们也可以聊聊。liujianjun_@163.com
shenxin 2001-12-12
  • 打赏
  • 举报
回复
非常高兴和大家做朋友
我的Email: hytgsx@sohu.com
OICQ:2581130
shenxin 2001-12-11
  • 打赏
  • 举报
回复
to bluepower2008(蓝色力量),非常感谢,我先试试看。
能交个朋友吗,我是初学SQL SERVER,有很多问题呢
bluepower2008 2001-12-10
  • 打赏
  • 举报
回复
对不起,前两天没有上网,所以没有及时回答大家的问题。
to wanghu(不懂就是不懂):在select语句中指定锁类型,该锁会保持到由语句所处理的全部数据上的事务结束,所以我在select语句前加上了begin tran,在该事务没有回滚或提交前,select出来的记录都不会被其他进程操作,不会出现你感觉的问题。
当然使用你所说的对整个事务设置最高隔离级别,也是可以,但这种方式的并发级别很低,在编程时应尽量避免。

另外,回答shenxin(木头)的问题:
1。加锁时间不会很长,应该是毫秒级,在加锁时,其他的调用只有等待锁的释放,如果锁的时间很长,最后得到的错误提示是执行sql语句超时。超时时间在设置服务器时指定,可由程序对特定的操作指定特定的超时时间。
2。对整个事务设置最高隔离级别的语句是:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
shenxin 2001-12-08
  • 打赏
  • 举报
回复
to wanghu(不懂就是不懂):对整个事务设置最高隔离级别,如何设置?

如何处理这种因加锁引起的错误?
shenxin 2001-12-07
  • 打赏
  • 举报
回复
大家再讨论啊
shenxin 2001-12-07
  • 打赏
  • 举报
回复
如果加锁的操作需要较长时间,那么其它用户再调用时会得到错误吗?
bluepower2008 2001-12-06
  • 打赏
  • 举报
回复
这个问题很简单,在检索控制表时,使用排他锁,保证在检索及置位的几微秒的时间内,任何其他连结都不能访问这个表就行了.
wanghu 2001-12-06
  • 打赏
  • 举报
回复
with xlock是通知系统(如查询优化器)执行此语句使用排它加锁方式(默认时select只是不可写但可读的加锁方式)。
不过感觉这个还是不对,在select完毕之后与update之前其他进程有可能进入。
不如对整个事务设置最高隔离级别。或者利用单个update语句:
update yourtbl set flag=1 where flag=0
if @@rowcount>0
...
shinebei 2001-12-06
  • 打赏
  • 举报
回复
对了,是不是可以对此存储过程首尾加上begin tran和commit tran呢
第二个用户要调用的时候先判断一下:IF @@TRANCOUNT > 0,只是这个办法只适用调用此一个存储过程,如果在调用此过程时还有其他tran在调用中,可能就行不通了,不过是不是还可以再在tran上想点办法呢
shenxin 2001-12-06
  • 打赏
  • 举报
回复
没有人知道了?
shenxin 2001-12-06
  • 打赏
  • 举报
回复
谢谢大家捧场,谢谢bluepower2008(蓝色力量)的精彩回答
to hcgui(浪子),你问得好,再麻烦bluepower2008(蓝色力量)解释一下

非常感谢!
shenxin 2001-12-06
  • 打赏
  • 举报
回复
谢谢大家捧场,谢谢bluepower2008(蓝色力量)的精彩回答
to hcgui(浪子),你问得好,再麻烦bluepower2008(蓝色力量)解释一下
hcgui 2001-12-06
  • 打赏
  • 举报
回复
学DB不久,请教:
select @isRun = flag from control_table with XLOCK
是什么意思?谢谢!
bluepower2008 2001-12-06
  • 打赏
  • 举报
回复
declare @isRun bit
begin tran
select @isRun = flag from control_table with XLOCK
where name = 'RUN_FLAG'
if @isRun
begin
rollback tran
return -1
end

update control_table set flag = 1 where name = 'RUN_FLAG'
commit tran

--其他执行代码
流星尔 2001-12-06
  • 打赏
  • 举报
回复
to 楼上的:
我知道排他锁,但不知道怎么用,能给个简单的例子吗。
bluepower2008 2001-12-05
  • 打赏
  • 举报
回复
我记得这个问题好像讨论过,你查查以前的帖子吧!
我给你说一个苯办法,就是建个控制表,在存储过程执行时,先判断表中的控制字段有没有置上, 置上了表示有存储过程在运行,退出;没有就置上,然后运行,执行完后再置回.如果要防止存储过程异常中断使标志始终置上,定义事务,失败自动回滚就行了.
加载更多回复(2)

34,603

社区成员

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

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