关于存储过程互斥的问题

findcsdn 2011-07-28 09:06:53

现在用Sqlserver和Delphi开发了一个应用程序,有多个客户端直接连接数据库。

当多个用户同时录入数据的时候,要求各个客户端能够互斥。

不知道存储过程怎么写,sqlserver 有什么机制可以实现这个功能。


...全文
158 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cd731107 2011-07-29
  • 打赏
  • 举报
回复
互斥, 比如一个人录入单据, 另一个在进行结算处理,并且不能有两个客户端在同时进行结算处理

这样的化,对菜单所在表楼主要增加一个字段:当前操作人数

客户打开菜单,判断对应菜单的当前操作人数,如果为零则可以操作,大于零的化不允许操作,
如果可以操作的化,一旦客户进入操作后,要把此字段的对应菜单记录的值加1,
控制不允许其他人再操作此菜单
AcHerat 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 findcsdn 的回复:]

引用 3 楼 bigint 的回复:

互斥什么意思?
如果是主键不能重复,根本不必处理,设置主键就可以了


互斥, 比如一个人录入单据, 另一个在进行结算处理。 显然两个工作不能同时进行的。

并且不能有两个客户端在同时进行结算处理,这些怎么在Sqlserver上进行处理呢?

另外,插入记录的时候, 现在使用 SCOPE_IDENTITY() 在存储过程中返回ID值的,……
[/Quote]

看楼主这样说,关于这个表的处理的SQL语句貌似都要加表级锁了。。。

对于SCOPE_IDENTITY(),作用域是当前会话,不用担心你说的那种问题。
BigInt 2011-07-29
  • 打赏
  • 举报
回复
表锁定需要慎重,带来的代价是并发性严重损失
BigInt 2011-07-29
  • 打赏
  • 举报
回复
1、这种互斥必须用锁来控制,三言两语具体用法说不清楚,自己查查资料
2、插入记录的时候, 现在使用 SCOPE_IDENTITY() 在存储过程中返回ID值的做法没有问题,SCOPE_IDENTITY()返回本连接本表的最后ID。
findcsdn 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bigint 的回复:]

互斥什么意思?
如果是主键不能重复,根本不必处理,设置主键就可以了
[/Quote]

互斥, 比如一个人录入单据, 另一个在进行结算处理。 显然两个工作不能同时进行的。

并且不能有两个客户端在同时进行结算处理,这些怎么在Sqlserver上进行处理呢?

另外,插入记录的时候, 现在使用 SCOPE_IDENTITY() 在存储过程中返回ID值的,不知道多个客户端调用会不会引起混乱。



cd731107 2011-07-29
  • 打赏
  • 举报
回复
update S_ProcListupdate S_ProcList with(updlock) set [flag]=1 where ProcName = 'sp_OrderItem'

更新存贮过程列表 设置标志[flag]=1 ,当存贮过程名称是'sp_OrderItem',
更新时加with(updlock),即读取表时加更新锁(写锁),而不是加共享锁(读锁)
findcsdn 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cd731107 的回复:]

互斥, 比如一个人录入单据, 另一个在进行结算处理,并且不能有两个客户端在同时进行结算处理

这样的化,对菜单所在表楼主要增加一个字段:当前操作人数

客户打开菜单,判断对应菜单的当前操作人数,如果为零则可以操作,大于零的化不允许操作,
如果可以操作的化,一旦客户进入操作后,要把此字段的对应菜单记录的值加1,
控制不允许其他人再操作此菜单
[/Quote]


看有人这么做的,不太明白

加了一个互斥表(proc, flag)

在存储过程前加一句话
update S_ProcList with(updlock) set [flag]=1 where ProcName = 'sp_OrderItem'

不知道这句话有什么用途

findcsdn 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bigint 的回复:]

表锁定需要慎重,带来的代价是并发性严重损失
[/Quote]


我原来想法是建一个表,这里放互斥标志,所有操作先检查这个表,要求对这个表的操作时互斥的。
AcHerat 2011-07-28
  • 打赏
  • 举报
回复
加个时间戳?
BigInt 2011-07-28
  • 打赏
  • 举报
回复
如果是一个输入,另一个不能输入(这样确实太BT,几乎没有实例是这样的需求的),那就再输入前锁定表,输入完成后提交事务
BigInt 2011-07-28
  • 打赏
  • 举报
回复
互斥什么意思?
如果是主键不能重复,根本不必处理,设置主键就可以了
AcHerat 2011-07-28
  • 打赏
  • 举报
回复
汗死,是插入!看错。
AcHerat 2011-07-28
  • 打赏
  • 举报
回复
存储过程里加事务控制,有必要的话在表中可以加排它锁。

22,210

社区成员

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

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