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