Re: [請益] 請問關於不重複編號
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
討論串 (同標題文章)
完整討論串 (本文為第 3 之 4 篇):
2
9
PHP 近期熱門文章
PTT數位生活區 即時熱門文章