作者stony1990 ()
看板PHP
標題[請益] 同步新增資料庫問題
時間Thu Sep 26 16:45:05 2013
請問一下各位前輩:
目前我的訂單系統是將資料庫最大的訂單編號加1,來當我現在的訂單編號,
但如果有兩個使用者同時按下上傳按鈕時候就會發生同步問題,會變成有兩筆同樣編號的
訂單!
我的解決辦法是先把資料庫設成innodb後然後用語法解決
以下是我的code
http://pastie.org/8356648
但是實際測試時候,我還是發生兩個人同樣號碼的情況了,希望有類似經驗的朋友可以指
導一下 感謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 36.231.85.179
※ 編輯: stony1990 來自: 36.231.85.179 (09/26 16:45)
1F:→ lyforever:加上timestamp判斷? 09/26 16:47
2F:→ itisjoe:訂單編號應該是primary key吧 加上auto_increment屬性試試 09/26 16:56
用年月日加上流水序號的訂單編號也能使用嗎?
4F:→ rickysu:下了 transaction 並不代表一定沒問題。 09/26 17:16
不代表沒問題?但這部份真的不能出錯,無論怎麼作都無法防嗎?
※ 編輯: stony1990 來自: 36.231.85.179 (09/26 17:23)
※ 編輯: stony1990 來自: 36.231.85.179 (09/26 17:24)
※ 編輯: stony1990 來自: 36.231.85.179 (09/26 17:25)
5F:→ rickysu:印象中Mysql預設交易層級不是SERIALIZABLE。有可能會發生 09/26 18:05
6F:→ rickysu:上面提到的幾種例外狀況,請善用 SET TRANSACTION。 09/26 18:06
7F:→ rickysu:變更交易層級。 09/26 18:07
8F:→ rickysu:總之 SET TRANSACTION SERIALIZABLE。就沒問題拉。 09/26 18:07
意思是在下QUERY語句的時候下START TRANSACTION這樣嗎?
※ 編輯: stony1990 來自: 36.231.85.179 (09/26 18:47)
9F:→ xxxzzz:mysql隔離層級預設是REPEATABLE READ 09/26 23:10
10F:→ xxxzzz:或是你改用SELECT ... FROM ... LOCK IN SHARE MODE 09/26 23:11
11F:→ xxxzzz:我想了一下,你應該是要select最大編號的時候排它 09/26 23:36
12F:→ xxxzzz:交易過程,用 SELECT ... FROM ... FOR UPDATE 試看看 09/26 23:37
13F:→ chenlarry:一般都是用FOR UPDATE去lock table,避免別人同時寫入 09/27 00:25
請問一下,for update不是更新嗎?但我連insert資料時的同步也能解決嗎?
我的疑問是,還沒insert怎麼update呢?
※ 編輯: stony1990 來自: 36.231.85.179 (09/27 09:40)
14F:→ xxxzzz:select...for update,是將資料列加排它鎖,避免交易期間 09/27 23:34
15F:→ xxxzzz:其他連線使用select..for update、select..lock in share 09/27 23:36
16F:→ xxxzzz: mode 讀取鎖定的資料列 09/27 23:37
17F:→ xxxzzz:但須注意,若用普通的 select ... 還是可以讀取 09/27 23:37
19F:→ xxxzzz:剛想到,不用交易的話,用GET_LOCK、RELEASE_LOCK也是可以 09/27 23:42
20F:→ chenlarry:當你下select .. for update的時候,如果沒有明確指定 09/28 00:51
21F:→ chenlarry:row,就會鎖住整個table,這時候別人都不能對這張table 09/28 00:52
22F:→ chenlarry:做任何修改,只有下for update的人可以修改,當你update 09/28 00:52
23F:→ chenlarry:之後,這個鎖就會解開,這樣就可以避免別人同時修改資料 09/28 00:53