复杂的存储过程。中高级的水平的朋友请进
hyq03 2007-07-06 10:33:32 表名 tabl1
表的主要字段(假如当前有5000条记录)
ID Flag(1,20两种) NeedCardType(值1,2,3三种)
1 1 1
2 1 1
3 1 2
4 1 1
5 3 2
7 1 1
8 1 3
9 1 3
------------------------------------------------------
需要处理 Flag为1的值,
简单说明.
NeedCardType有三种值,1/2/3,[1/2]可以为单独队列,[3]在AllSame=0情况下要需要拆分到[1/2]队列
-------------------------------------------------------------------------------
需求:
现需要有3条线程需要处理里面的数据,某一时刻数据是变化的〔新纪录添加进来)
保证每个线程的数据不同重复,且每次每个线程处理的大小为1000,
每个线程附参数
1.CardType[0/1/2],0可以处理NeedCardType全部,1可以处理[1/3]值,2可以处理[2/3],3是共享的.
2.Total ,总口数
3.Id ,本次ID的值不会重复,递增1.,如果AllSame=0可能会重复,AllSame=1不会重复
4.AllSame(本次处理是否全部CardType是相同的(全部为1/2/0)),AllSame=0情况,NeedCardType=3需要拆分2个队列,分发到1或者3
比如:5个线程,参数
CardType Total Id AllSame(CardType不相同)
1 3 1 0
1 3 2 0
1 3 3 0
2 2 1 0
2 2 2 0
先拆NeedCardType=3拆开2个队列,加入到1/2队列.均分
-------------------------
CardType Total Id AllSame(CardType全相同)
1 5 1 1
1 5 2 1
1 5 3 1
1 5 4 1
1 5 5 1
处理全部为NeedCardType为1或3
------------------------------------------
CardType Total Id AllSame(CardType全相同)
0 5 1 1
0 5 2 1
0 5 3 1
0 5 4 1
0 5 5 1
处理全部.
-------------------------------------
如果是单线程,CardType为1.处理全部为1或3的.
如果是单线程,CardType为2.处理全部为2或3的.
如果是单线程,CardType为0.处理全部.
可能出现的问题,[每处理10条数据,修改Flag=3代表已处理]
如果开始每个线程都取到自己的数据集,都开始工作.由于处理速度不同,可能线程1完成.线程2/3都在工作,
线程2/3还有200条Flag为1的数据,线程1重新取数据,这样就会取出2/3线程正在处理的数据就出现重复.
我的思路:在所有线程都取到自己的数据集后.马上修改状态.保证最先完成的线程不会提取别的线程正在处理的数据.
但没有成功.就是每个线程提取到自己的数据后.其它线程不能在读操作.
注意,
1. 保证N个 线程,每个线程处理的数据大小是均分的.且每次每个线程大小为1000,
最后一个线程处理不能被整除的余数+自己要处理的数据.
2.在实现功能后,代码要精简,不要使用游标,和临时表。执行速度要快.
3.采用分页技术给每个线程要处理的数据
成功后,哥们请吃饭(如果是北京的朋友.)QQ:752235215
-----------------------