请教帮忙拟定一个技术方案

梦断酒醒 2010-09-24 11:10:58
我要达到以下目的,麻烦各位达人帮忙设计一个方案:

1.对一张表有一个先查询后更新(update)部分记录的事务,该事务可能被并行调用,但是要求该事务是互斥的,即一旦外部有一个进程调用该事务,则紧接着另一进程调用该事务时,必须等待前面进程调用的该事务执行完毕后才能继续。
2.有另外的进程会在上述事务运行时查询或插入数据,该操作不必与上述事务操作互斥
3.第1个问题中提及的事务操作需要返回一个记录集,也就是说期望它返回一组记录。

因为该数据库会被不同的程序在不同的机器上调用,所以,上述工作期望在数据库中而不是应用程序中实现。在尝试过程中,碰到了以下问题
1.使用函数时,提示事务和Update错误
2.使用存储过程,不知道如何令它返回一个记录集
3.不知道如何实现上面第1个问题中提到的互斥。
...全文
140 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzj860704 2010-09-28
  • 打赏
  • 举报
回复
好难的问题,学习了
chn_justin 2010-09-28
  • 打赏
  • 举报
回复
只能加锁
Jadychenji 2010-09-27
  • 打赏
  • 举报
回复
进来学习一下, 支持了
王向飞 2010-09-26
  • 打赏
  • 举报
回复
大乌龟的代码完全可以解决你的问题。
xmx2009 2010-09-26
  • 打赏
  • 举报
回复
帮顶,学习
ws_hgo 2010-09-26
  • 打赏
  • 举报
回复
你大致思路出来啦

然后逐个做

做的时候

又不懂的再问

梦断酒醒 2010-09-26
  • 打赏
  • 举报
回复
谢谢各位,我尽快试试。
fengyun142415 2010-09-26
  • 打赏
  • 举报
回复
学习,帮顶
Rotel-刘志东 2010-09-24
  • 打赏
  • 举报
回复
还是比较复杂的。
1、执行某个update或者insert要独享的时候,要锁表。
「已注销」 2010-09-24
  • 打赏
  • 举报
回复
里面的逻辑确实挺复杂。
1.对一张表有一个先查询后更新(update)部分记录的事务,该事务可能被并行调用,但是要求该事务是互斥的,即一旦外部有一个进程调用该事务,则紧接着另一进程调用该事务时,必须等待前面进程调用的该事务执行完毕后才能继续。

=======
第一点,要实现资源独享,当你update时做需要锁表处理。

2.有另外的进程会在上述事务运行时查询或插入数据,该操作不必与上述事务操作互斥
=====
查询肯定肯定没问题,锁定过程中insert能不能操作呢?....

3.第1个问题中提及的事务操作需要返回一个记录集,也就是说期望它返回一组记录。
======
返回结果集应该没问题的,可以用临时表来处理。
billpu 2010-09-24
  • 打赏
  • 举报
回复
如dawugui所贴,合理利用rowlock,holdlock,必要时升级,另外存储过程返回记录集其实不难的,比如select就可以直接返回记录
dawugui 2010-09-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ishallwin 的回复:]
引用 1 楼 dawugui 的回复:
既然这么复杂,不如交给程序去处理,想怎么弄就怎么弄。


不是一个进程啊,在不同机器上同时调用呢,程序没法实现互斥啊。
[/Quote]
锁表,锁记录。
1 如何锁一个表的某一行

A 连接中执行

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

begin tran

select * from tablename with (rowlock) where id=3

waitfor delay '00:00:05'

commit tran

B连接中如果执行

update tablename set colname='10' where id=3 --则要等待5秒

update tablename set colname='10' where id<>3 --可立即执行

2 锁定数据库的一个表

SELECT * FROM table WITH (HOLDLOCK)


注意: 锁定数据库的一个表的区别

SELECT * FROM table WITH (HOLDLOCK)
其他事务可以读取表,但不能更新删除

SELECT * FROM table WITH (TABLOCKX)
其他事务不能读取表,更新和删除
梦断酒醒 2010-09-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dawugui 的回复:]
既然这么复杂,不如交给程序去处理,想怎么弄就怎么弄。
[/Quote]

不是一个进程啊,在不同机器上同时调用呢,程序没法实现互斥啊。
dawugui 2010-09-24
  • 打赏
  • 举报
回复
既然这么复杂,不如交给程序去处理,想怎么弄就怎么弄。

34,589

社区成员

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

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