取編號算法(多用戶同時操作同一數據資料表),防止編號重復---分數沒有問題

foreveryday007 2002-07-05 03:39:22
取編號算法:
問題提出:
1.兩個用戶(或者以上)同時打一資料(或單據),為說明清楚, 設有客戶表(Table_Cust.DB)
內有關鍵字段(主關鍵字或者索引)custno,其他還有很多字段.......;如果有A用戶輸入編號
KH001(設這個時候資料表還沒有任何資料),他還沒有存檔; 就在這個時候B用戶也輸入KH001,
,如果焦點退出,我希望這個時候系統不給它過,要有提示(有人正在使用此編號);
2.另外我的系統有個自動取編號的功能; 現在設資料表里已經有KH001,KH002編號;同時有兩用戶,
A用戶點新增,系統會產生KH003編號,此時沒有存檔,B用戶此時點新增系統要產生KH004;
3.如果有用戶占用號碼,此時其他模塊(如應收付帳中有客戶欄位,要校驗客戶編號是否合法)
應該不考慮此占用的號碼
略為分析:
1,其實難點在於並發的控制,特別是多用戶同時取用編號時;(因為存檔時我們再校驗)
2,數據庫類型為Paradox,Infomix,SQL Server,Postgre SQL;
3,現在有兩種做法:(我個人認為都比較麻煩,做起來比較煩,不方便)
A:加一張資料表(Table_NO),專門存放我們取用的編號(占用的編號/還沒有存檔),
新增(更新)操作(退出編號欄位):
手工取用編號:要到兩張資料表中去尋找是否有存在的編號
若有(提示編號已用);否則再存給Table-NO,pass
自動取用編號:要到兩張資料表中去尋找最大的編號,然後加1,再存給Table-NO
一旦有存檔動作:我們要把Table-NO中的相應編號刪除
若有放棄動作:同樣要Table-NO中的相應編號刪除
B:另一種做法是在Table_Cust加一字段(suse),用來標誌是否真正存檔;
也是就是若一用戶取用編號后,我們要做一個假存檔的動作;若沒有真正的存檔,我們
再做刪除的動作;
4.此兩做法,都不是太好:
A.的做法只要修改一個地方,就是新增(更新)操作時,但是同時會存在對Table_NO的並
發控制問題,對於這個問題,我們現在採用對資料表加鎖的方法,但是這也是存在問題,
鎖的時間長短問題,是否能解開鎖的問題,真的比較頭痛;有時會沒辦法控制;
B.的做法就是基於這一點,我們又提出來的新方法,這種方法任何關聯的地方都要修改,
就是那個地方有Table_Cust資料表就要修改,它同時要面對的也是有並發控制,還有死
機的問題
5.所有資料表有到用編號的地方都有此問題,發動難度比較大
希望各位HELP:
分數沒有問題,歡迎大家討論;有講不清楚的地方,我再作補充;我現在尋找的是一種比較
安全可靠方法的實用,各位若有好的方法,一定要說啊;
...全文
171 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
foreveryday007 2002-08-14
  • 打赏
  • 举报
回复
讓用户输入编号:是體現比較個性化,通常用戶也有這方面的要求
自动递增不可以吗? 不可以;沒有一定的格式,也不能讓用户输入编号,並且這個類型也有好多麻煩(多數據庫)
RobinHZ 2002-08-13
  • 打赏
  • 举报
回复
或者还是用你的A方法,只不过Table_NO里保存所有已经存档的编号和正在使用但还没有存档的编号,后面的用户手工输入编号时直接从这个表里判断空号、是否已占用等,然后将可用号insert进去(如果有其他用户同时在插入这个编号,则有一方会返回错误,可就此提示此编号已在使用),而当此用户放弃输入时将此编号从表中删除。
foreveryday007 2002-08-13
  • 打赏
  • 举报
回复
>>>>
后存的一个会返回错误,在程序中可以利用该错误信息来重新生成一个编号,
>>>>
這樣用戶一開始的那個編號就改變了,用戶這時候他不能接受,因為他一開始輸入的是一個編號,而存檔時又改變了;
所以我不知如何是好?
rwdx 2002-08-13
  • 打赏
  • 举报
回复
我是保存是控制的,保存时可采用循环或是事务控制,因为那个编号在数据定义中是唯一的,当有两个编号相同的记录保存时肯定会发生冲突,后存的一个会返回错误,在程序中可以利用该错误信息来重新生成一个编号,然后存入表,
foreveryday007 2002-08-13
  • 打赏
  • 举报
回复
编号无需固定其顺序
編號有其自己的格式,用戶可自己定義
eg: yymmdd9999 or user1YYMMDD9999
我們要實現的也是
首先搜索有没有中间空闲的编号(也就是楼上有些朋友说的某个用户发单了后又取消的那种情况),如果有,就拿来用,没有就新生成一个
其中的麻煩是:若有多個用戶同時取用編號時,你是如何處理的?
rwdx 2002-08-13
  • 打赏
  • 举报
回复
我现在的情况是,编号无需固定其顺序,但不允许有重复或中间空闲的编号,
我采用的是在用户保存那条数据时生成编号,首先搜索有没有中间空闲的编号(也就是楼上有些朋友说的某个用户发单了后又取消的那种情况),如果有,就拿来用,没有就新生成一个
rwdx 2002-08-13
  • 打赏
  • 举报
回复
你的编号需要固定其顺序吗?
popmailzjw 2002-08-13
  • 打赏
  • 举报
回复
为什么要让用户输入编号呢?自动递增不可以吗?
foreveryday007 2002-08-13
  • 打赏
  • 举报
回复
先让A,B用户取得的编号都为F003,
????這樣肯定不行;你要記住:用戶在欄位輸入的編號,在這個時候你就要去校驗是否有重號(還有別的用戶正在輸入資料,還沒有存檔);
因為用戶發現如果這個時候校驗正確,你就應該把這個編號存入資料表中(這也是對的)
popmailzjw 2002-08-13
  • 打赏
  • 举报
回复
大家好,我觉得这个问题很有普遍性,不过我有一个笨想法不知道可不可行。
我先让A,B用户取得的编号都为F003,当A用户写入数据后,B用户接着写入数据,
但是B用户写入时检查F003 的存在,如果存在,则自动增1为F004,然后再重复检查F004 的存在 ,直到取得的编号不存在(不重复)。如果需要再返回新的编号给用户。
这样如果可以的话,就不要考虑跳号的问题,也不会存在空号。
有更好的方法请记得告诉我。
foreveryday007 2002-08-13
  • 打赏
  • 举报
回复
>>>>>>>>>
3,現在有兩種做法:(我個人認為都比較麻煩,做起來比較煩,不方便)
A:加一張資料表(Table_NO),專門存放我們取用的編號(占用的編號/還沒有存檔),
新增(更新)操作(退出編號欄位):
手工取用編號:要到兩張資料表中去尋找是否有存在的編號
若有(提示編號已用);否則再存給Table-NO,pass
自動取用編號:要到兩張資料表中去尋找最大的編號,然後加1,再存給Table-NO
一旦有存檔動作:我們要把Table-NO中的相應編號刪除
若有放棄動作:同樣要Table-NO中的相應編號刪除
B:另一種做法是在Table_Cust加一字段(suse),用來標誌是否真正存檔;
也是就是若一用戶取用編號后,我們要做一個假存檔的動作;若沒有真正的存檔,我們
再做刪除的動作;
4.此兩做法,都不是太好:
A.的做法只要修改一個地方,就是新增(更新)操作時,但是同時會存在對Table_NO的並
發控制問題,對於這個問題,我們現在採用對資料表加鎖的方法,但是這也是存在問題,
鎖的時間長短問題,是否能解開鎖的問題,真的比較頭痛;有時會沒辦法控制;
B.的做法就是基於這一點,我們又提出來的新方法,這種方法任何關聯的地方都要修改,
就是那個地方有Table_Cust資料表就要修改,它同時要面對的也是有並發控制,還有死
機的問題
>>>>>>>>>
其實我是比較傾向於A做法;我也講了這個做法存在的問題(也是我們程序在客戶那邊行很長時間出現的問題),
還有>>
2,數據庫類型為Paradox,Infomix,SQL Server,Postgre SQL;
因為不同的數據庫關係,在用A方法時,確實是有問題多多,主要是系統不穩定
>>>也由於這些問題,想讓csdn上的高手出招;再次謝謝各位!
erickleung 2002-07-09
  • 打赏
  • 举报
回复
假如你是要连续, 又不可能重覆的序号, 需要小心安排才可以. 尤其是当用户
取消己发出的单据, 言该序号是否可以重用呢? 重用已发出/编印, 但後来取消
的单据序号, 你一定要另透过编程来解决.

我通常有两个序号: 只当用户打印单据时, 或是单据确认时, 才正式发单据序号,
而其他的自动增加字段只是用来登记数据吧.
foreveryday007 2002-07-09
  • 打赏
  • 举报
回复
HappyBoy(BJ) 老兄的方法就是我現在正要採用的方法,也就是第二種方法,修改起來比較煩,好像也有點問題,我想能不能有更好一點的算法,流程
foreveryday007 2002-07-09
  • 打赏
  • 举报
回复
尤其是当用户
取消己发出的单据, 言该序号是否可以重用呢?
>>>>>>>>>>>>>
其實你講的這個意思應該是個是否補空號,程序中有控制,也可以補也可以不補;
你說用兩個序號不知如何處理?我覺得很難做到,單據編號的唯一性;
>>>>>>>>>>>>>
我們程序里現在的要求是如何知道有人正在占用編號(已經退出編號edit,還沒有存檔的編號,可能是我們程序自動生成,也可能是用戶自己輸入);占用的編號是否和我現在的編號重復;如果是自動生成編號,如何保證我們取用的編號是唯一的(要考慮到占用的編號)
foreveryday007 2002-07-09
  • 打赏
  • 举报
回复
尤其是当用户
取消己发出的单据, 言该序号是否可以重用呢?
>>>>>>>>>>>>>
其實你講的這個意思應該是個是否補空號,程序中有控制,也可以補也可以不補;
你說用兩個序號不知如何處理?我覺得很難做到,單據編號的唯一性;
>>>>>>>>>>>>>
我們程序里現在的要求是如何知道有人正在占用編號(已經退出編號edit,還沒有存檔的編號,可能是我們程序自動生成,也可能是用戶自己輸入);占用的編號是否和我現在的編號重復;如果是自動生成編號,如何保證我們取用的編號是唯一的(要考慮到占用的編號)
foreveryday007 2002-07-08
  • 打赏
  • 举报
回复
To zswang(伴水) :
我現在這里要做的是防止用戶取了相同的編號,假如a用戶 用了編號kh001(還沒有存檔),這時候b用戶再輸入kh001(在退出edit時,我就要給他提示,有人正在使用此編號);---------這種情況是用戶人工自己選擇編號的問題
另外一個是:我們系統自動給它取編號(用戶可定義格式,如yyyymmdd99999),這個時候我們如何保證系統取用的編號是沒有重復的,另外要考慮到有人占用編號的情況
如果只是僅僅取一個唯一編號,沒有甚麼難的,關鍵在於用戶同時操作,有可能是多系統,還要考慮有人占用的編號,對同一資料表並發的操作
foreveryday007 2002-07-08
  • 打赏
  • 举报
回复
HappyBoy(BJ) 說:
你只有用编程序去解决它,我们曾经遇到过这样的问题,我们增加了一个字段,标示是否有用户正在操作它从而避免编号重复的情况.
foreveryday007 2002-07-08
  • 打赏
  • 举报
回复
To fermium(列御寇) :
如何做到編號個性化,唯一性
fermium 2002-07-08
  • 打赏
  • 举报
回复
foreveryday007(foreveryday007)
编号当然可以个性化,但数据的存储要个性化就会有问题
foreveryday007 2002-07-06
  • 打赏
  • 举报
回复
GUID是能產生一個唯一的編號,可是我現在的資料表中,也就是用戶想要的編號是可以人工輸入,也可以自行定義格式,並且這個基本資料表關聯的地方很多,存在多程序,多用戶,同一時刻要取用的問題
加载更多回复(17)

5,387

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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