!!!关于一个并发的问题。很着急。望热心的朋友帮个忙 谢谢。

xczgb 2008-01-22 01:20:25
有2个数据表A,B

我有一个winform程序,同时运行在多台PC机上,这个程序的功能是:定时在A表中取一百条数据,每一条数据进行相应的处理后插入到B表中,并在A表中删除该记录。

出现了问题:B表中出现很多重复的记录。

winform程序是用c#.net写的。用的是dataset存储那100条记录进行操作,离线并发该怎么做。谢谢各位了。
...全文
252 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2008-01-26
  • 打赏
  • 举报
回复
sql 2005 的话, 取数据的方法会更简单

UPDATE TOP(1) A SET
标记 = N'已取'
OUTPUT
inserted.*
FROM 你的表
WHERE 标记 = N'未取'
zjcxc 元老 2008-01-26
  • 打赏
  • 举报
回复
完成操作后再根据主键值把记录删除掉即可.


默认情况下, SELECT 只下共享锁, 不会防止别人访问, 而且 SELECT 锁一般在 SELECT 完成后即释放
故一般不建议事务+SELECT+锁

所以标记的方法会比较省事, 锁的范围和时间都很小(像我上面取数据的示例根本就没有显式加事务和锁)
zjcxc 元老 2008-01-26
  • 打赏
  • 举报
回复
你的表应该有主键吧? (没有主键(或者唯一键)会存在数据定位的问题)


SET NOCOUNT ON
-- 取数据可以这样定
DECLARE
@主键 int -- 根据你的主键定义(也可以是唯一键)

SET ROWCOUNT 1 -- 只取一条
UPDATE A SET
@主键 = 主键,
标记 = N'已取'
FROM 你的表
WHERE 标记 = N'未取'

SELECT * FROM 你的表
WHERE @主键 = 主键
arrow_gx 2008-01-24
  • 打赏
  • 举报
回复


1、加字段标示,
2、或者用一下方法读取数据, 呵呵,和上面的锁顺序换一下
   SELECT * FROM test_user WITH (ROWLOCK,READPAST) 
--ROWLOCK 对行进行加锁,下次别的机器 用 READPAST 方式就不会读取了,呵呵
--READPAST 忽略锁,忽略(不读取)被锁定的行
ojuju10 2008-01-24
  • 打赏
  • 举报
回复
用事务+锁
fcuandy 2008-01-23
  • 打赏
  • 举报
回复
加标记列. 用锁不是好办法.
cxmcxm 2008-01-23
  • 打赏
  • 举报
回复
更新时启动事务,再将事务隔离级别设为可串行读
xczgb 2008-01-23
  • 打赏
  • 举报
回复
顶。。。。。。。。。。。。。。。。。。。。。。
learning-diary 2008-01-23
  • 打赏
  • 举报
回复
看一下sql的事务,共分四个等级
JiangHongTao 2008-01-22
  • 打赏
  • 举报
回复
找一个表设置一个字段
启动事务,
将字段变为1
读取a表
处理
写b表
将字段变为0
成功提交
失败回滚
中国风 2008-01-22
  • 打赏
  • 举报
回复
--事务1
begin tran
SET ROWCOUNT 100

SELECT *

FROM tb WITH(UPDLOCK, READPAST)

---事务2
BEGIN TRAN

SET ROWCOUNT 100

SELECT *

FROM tb WITH(UPDLOCK, READPAST)
xczgb 2008-01-22
  • 打赏
  • 举报
回复
我试了不行的。还是有很多重复记录。。。。。。。。。。。。
-狙击手- 2008-01-22
  • 打赏
  • 举报
回复
select   top   100   *   from   table   WITH   (ROWLOCK)
xczgb 2008-01-22
  • 打赏
  • 举报
回复
roy_88
中国风
-------------------

那一百条怎么加锁阿。小弟是个初学者啊。。谢谢了
-狙击手- 2008-01-22
  • 打赏
  • 举报
回复
select top 100 * from table WITH (ROWLOCK)
-狙击手- 2008-01-22
  • 打赏
  • 举报
回复
select top 100 * from table WITH (NOLOCK)
中国风 2008-01-22
  • 打赏
  • 举报
回复
取一百条加锁
xczgb 2008-01-22
  • 打赏
  • 举报
回复
快来人啊。。。
xczgb 2008-01-22
  • 打赏
  • 举报
回复
不行啊。。晕死了。。。。
wyb0026 2008-01-22
  • 打赏
  • 举报
回复
俺喜欢6楼的方法,但好像要加事务

begin tran --前台程序写
SELECT top 100 * FROM test_user WITH (READPAST,ROWLOCK)
.......
delete .....
commit tran
加载更多回复(12)

34,588

社区成员

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

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