Re: [請益] 請問關於不重複編號

看板PHP作者 (LaPass)時間13年前 (2012/09/05 02:18), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/4 (看更多)
KeyWord 執行緒安全 雖然PHP中沒執行緒的概念 但實際上,每一個request就是一條執行緒 先不管這合不合乎「執行緒安全問題」的定義 但這是兩個並行的程序存取同一資源時,都會遇到的問題 舉例來說,如果程式是這樣 1.取得資料庫中的序號的最大值 2.將最大值+1 3.存回資料庫 現在,最大值是 3 同一時間有A、B條執行緒 執行順序可能是這樣: A1 取得3 A2 +1 成為 4 B1 取得3 A3 存回,序號為4 B2 +1 成為 4 B3 存回,序號為4 一般狀況下,執行的順序是由作業系統在管理 沒辦法保證執行的順序 這在有些狀況下會出大問題,例如金融轉帳之類的 這時候,一般程式都會有一套方法去保證他的執行順序、資源安全性 通常是叫做原子操作(英文叫做Atomic之類的)、同步(synchronized之類的) 但很抱歉,PHP中沒這個東西,至少我沒看到過,所以要從資料庫下手 另外不要以為把sql寫在同一行就能夠保證不會出現這種問題 資料庫內部也是有很多執行緒在跑SQL命令的 所以也可能會出錯 資料庫叫這種行為叫做交易模式(transaction)、鎖定(LOCK)之類的 簡單來講,就是有人打算寫東西進去時,把那個資料表給鎖住,不讓別人讀、寫 直到操作結束才釋放 以及,一連串的動作都成功時,才會讓命令生效 -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.38.75.74
文章代碼(AID): #1GHaNaIN (PHP)
文章代碼(AID): #1GHaNaIN (PHP)