2017-07-17 47 views
0

我有一個每天接受數百個數據的php系統。即時通訊使用MySQL作爲數據庫來存儲所有的數據。自動增加一個獨特的varchar可能會導致重複

其中一個主表,讓我們稱之爲'tableData',存儲所有的主要數據,並有2個主鍵。第一個主鍵是一個自動增量整數。第二個主鍵是以此格式存儲varchar值的submission_num(rep/yyyy/AIinteger,例如rep/2017/00021,rep/2017/00023,rep/2016/02345)

當數據需要要提交到tableData中,php將檢索submission_num的最大數量並將其增加1,然後使用新的submission_num將新數據插入到tableData中。 (例如,如果php收到rep/2017/00034作爲最大數量,它會將整數部分增加1,這會導致新的提交num rep/2017/00035,然後將新數據與新提交一起存儲NUM)

PHP腳本的算法看起來像這樣

  1. 獲取最大submission_num,
    查詢:SELECT submission_num FROM表資料WHERE SUBSTR(submission_num,5,4)=「$ curYear 'ORDER BY submission_num DESC LIMIT 0,1

  2. 由1

  3. 商店增加的整數部分數據

此方法造成一個問題。當兩個或更多用戶在適當時刻點擊「提交」按鈕。他們將生成相同的提交數量並保存到數據庫與重複提交數量(此提交數量需要是唯一的)

有沒有辦法我可以暫時鎖定從我的PHP腳本的任何選擇查詢表?

+0

btw,即時通訊非常抱歉,如果我通知你們很差。 im在英語中很糟糕 –

+0

根據使用表的類型,您將使用事務或鎖。無論如何,如果您在一個表中需要兩個自動增量,則表明您可能只需要其中一個,或者您可能需要創建另一個表。 –

回答

0

表只有一個主鍵約束,它可以有多個唯一約束。現在將肥皂箱放在一旁。

您遇到問題了,因爲submission_num代表表的3個不同屬性。因爲您想在插入行時計算第三個屬性(給定行集上的子序列),所以您有一個併發問題導致您提出有關鎖定表的問題。

你應該做的是定義表模式的現實模式,並將submission_num的第一個組件存儲爲某種類型的代碼列,並將第二個組件存儲爲insert_date列。

然後,您可以在查詢表格後計算第3個「子屬性」。這樣,你做而不是必須鎖定表,這是用戶面臨的應用程序不應該做的事情。

附錄1

你可以在一個新表的變化(包括附加year_submission_num列),填充的行,其插入日期小於01-JAN-2017,然後創建一個觀點,即是year_submission_num兩個集合A和B的並集

集合A是year_submission_num不爲空的行集,您可以在其中定義投影列C,它是當前所具有的值的串聯。

集合B是一組行,其中year_submission_num爲空,在你寫一個比較複雜的子查詢產生C.

然後每天一次,你運行一個批處理作業來更新year_submission_num的地方是目前空值。這樣,「更復雜的子查詢」不是太昂貴。

如果你做的所有,那麼你將不必改變你的網頁。

+0

謝謝你的出色建議。但似乎會有太多的頁面需要重新編碼,因爲有相當多的頁面使用submission_num檢索數據。謝謝你的解釋。非常感謝 –

+0

@CatifyAuthent查看附錄1. – jeff6times7

+0

謝謝。起初很難理解,但現在我明白了。看來你的解決方案需要相當長的時間。我沒有太多時間,因爲我只能修改客戶公司的代碼和數據庫。他們不允許遠程。但我確實有源代碼和數據庫的副本。將嘗試在我的本地主機上實現這一點。如果它很好,那麼當我再次來到這裏時,我會執行它。這將是從現在起1個月。 *嘆息* –

-1

我不知道有些查詢是否可以處理這個問題,但我有一個簡單的方法。如果沒有像結果那樣的第二個主鍵,則可以在將整數部分增加1後再次執行檢查,您可以存儲數據。如果有第二個主鍵如結果,則可以再次將整數部分增加1。是的,你需要這個檢查循環過程

+0

然後檢查和插入之間可能會發生同樣的問題。 –

+0

即使你編輯它也不行,你仍然可以得到重複。您只能通過自動增量字段,鎖定或事務來解決這個問題。 –

+0

hi azis。感謝你的回答。是的,我同意每個人。同樣的問題仍然會發生。因爲我可以修改客戶公司的代碼,因爲我無法遠程訪問(並且我可能只能從現在起1個月再來),所以我實現了你的想法,除了每個循環腳本都會隨機休眠時間在1到5秒之間。我相信這會減少獲得重複提交數量的機會,但會減慢提交過程。現在我堅持這個解決方案 –

相關問題