[請益] 同步新增資料庫問題

看板PHP作者時間12年前 (2013/09/26 16:45), 編輯推噓0(0023)
留言23則, 5人參與, 最新討論串1/1
請問一下各位前輩: 目前我的訂單系統是將資料庫最大的訂單編號加1,來當我現在的訂單編號, 但如果有兩個使用者同時按下上傳按鈕時候就會發生同步問題,會變成有兩筆同樣編號的 訂單! 我的解決辦法是先把資料庫設成innodb後然後用語法解決 以下是我的code http://pastie.org/8356648 但是實際測試時候,我還是發生兩個人同樣號碼的情況了,希望有類似經驗的朋友可以指 導一下 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.231.85.179 ※ 編輯: stony1990 來自: 36.231.85.179 (09/26 16:45)

09/26 16:47, , 1F
加上timestamp判斷?
09/26 16:47, 1F

09/26 16:56, , 2F
訂單編號應該是primary key吧 加上auto_increment屬性試試
09/26 16:56, 2F
用年月日加上流水序號的訂單編號也能使用嗎?

09/26 17:15, , 3F
http://ppt.cc/fqMV 研究一下交易隔離吧
09/26 17:15, 3F

09/26 17:16, , 4F
下了 transaction 並不代表一定沒問題。
09/26 17:16, 4F
不代表沒問題?但這部份真的不能出錯,無論怎麼作都無法防嗎? ※ 編輯: 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)

09/26 18:05, , 5F
印象中Mysql預設交易層級不是SERIALIZABLE。有可能會發生
09/26 18:05, 5F

09/26 18:06, , 6F
上面提到的幾種例外狀況,請善用 SET TRANSACTION。
09/26 18:06, 6F

09/26 18:07, , 7F
變更交易層級。
09/26 18:07, 7F

09/26 18:07, , 8F
總之 SET TRANSACTION SERIALIZABLE。就沒問題拉。
09/26 18:07, 8F
意思是在下QUERY語句的時候下START TRANSACTION這樣嗎? ※ 編輯: stony1990 來自: 36.231.85.179 (09/26 18:47)

09/26 23:10, , 9F
mysql隔離層級預設是REPEATABLE READ
09/26 23:10, 9F

09/26 23:11, , 10F
或是你改用SELECT ... FROM ... LOCK IN SHARE MODE
09/26 23:11, 10F

09/26 23:36, , 11F
我想了一下,你應該是要select最大編號的時候排它
09/26 23:36, 11F

09/26 23:37, , 12F
交易過程,用 SELECT ... FROM ... FOR UPDATE 試看看
09/26 23:37, 12F

09/27 00:25, , 13F
一般都是用FOR UPDATE去lock table,避免別人同時寫入
09/27 00:25, 13F
請問一下,for update不是更新嗎?但我連insert資料時的同步也能解決嗎? 我的疑問是,還沒insert怎麼update呢? ※ 編輯: stony1990 來自: 36.231.85.179 (09/27 09:40)

09/27 23:34, , 14F
select...for update,是將資料列加排它鎖,避免交易期間
09/27 23:34, 14F

09/27 23:36, , 15F
其他連線使用select..for update、select..lock in share
09/27 23:36, 15F

09/27 23:37, , 16F
mode 讀取鎖定的資料列
09/27 23:37, 16F

09/27 23:37, , 17F
但須注意,若用普通的 select ... 還是可以讀取
09/27 23:37, 17F

09/27 23:42, , 19F
剛想到,不用交易的話,用GET_LOCK、RELEASE_LOCK也是可以
09/27 23:42, 19F

09/28 00:51, , 20F
當你下select .. for update的時候,如果沒有明確指定
09/28 00:51, 20F

09/28 00:52, , 21F
row,就會鎖住整個table,這時候別人都不能對這張table
09/28 00:52, 21F

09/28 00:52, , 22F
做任何修改,只有下for update的人可以修改,當你update
09/28 00:52, 22F

09/28 00:53, , 23F
之後,這個鎖就會解開,這樣就可以避免別人同時修改資料
09/28 00:53, 23F
文章代碼(AID): #1IG_GLrJ (PHP)
文章代碼(AID): #1IG_GLrJ (PHP)