通常在課本裡常舉例存錢並匯款
帳戶裡有80元
如果我同時匯款20,存款20
會有什麼狀況呢
正常來說帳戶裡應該還是80元,
因為自然人無法同時存款及匯款。
你可以叫你的朋友幫忙,你去存款時,同分同秒同微秒看會不會發生什麼事 XD
而電腦是怎麼看待這件事的呢
如果在同一時間下
1我要匯款會先取讀我現在有多少錢,並扣款變60,再匯出。
2問題來了,我同時存款20,我應該要讀到60元才是正確的,但因為同時間做,所以電腦讀到了80元,再存20,即100元。
如果這世界都這樣,大家都變有錢人了。
如同小刀所說:你的錢就是我的錢,我的錢就是你的錢,發財啦!
這就是一個競時的問題
在微軟的網站上有提出11點競爭問題
http://support.microsoft.com/kb/317723/zh-tw
這裡我只提Database
我們可以使用select … for update的語法來保護自己的交易
START TRANSACTION;
SELECT quantity FROM product WHERE product_id = 5 FOR UPDATE;
UPDATE product SET quantity = quantity - 1 WHERE product_id = 5;
COMMIT;
這裡舉的例子是,每當在交易時,會查尋數量,後再-1更新(實際上的語法會更多,例 大於零才扣庫存等…)
在MYSQL資料庫,只有Storage Engine 是 InnoDB 的情形下才有作用,且需要等查詢連線COMMIT後才可以做其他動作。
而 PostgreSQL 似乎其他連線還可以執行SELECT查詢。
以上是悲觀鎖定
以前做過樂觀鎖定,但現在CPU Thread 愈來愈多的情形下(不知道是不是這樣,但好像是),好像都無法太樂觀…
常觀測到的結果,都還剩一個品項結果還是多賣了一個。
我們預想的是
如果兩個人同時買一張票或一張票(房)且cpu還是會有處理上的差異(微秒之間)
正常來說
a買一張
b買一張
還剩一張
a先買 扣完 b查不到後,售完。
但往往是這樣
a先買 扣完 b還是查到一張,b再買,因為寫入剩於數質都是0 所以 ab 都買成了…
所以之後會再檢查是否過量count 所有買票的筆數,還是等於開放的筆數…
為什麼!! 可能b寫入太慢,或資料庫動作太慢…
不然也是有檢查,數量小於0,兩張都不成功,反正樂觀鎖定不Work就是了…
(ps:使用機器人狂買所測出的結果,實際上真的還是發生了)
帳戶裡有80元
如果我同時匯款20,存款20
會有什麼狀況呢
正常來說帳戶裡應該還是80元,
因為自然人無法同時存款及匯款。
你可以叫你的朋友幫忙,你去存款時,同分同秒同微秒看會不會發生什麼事 XD
而電腦是怎麼看待這件事的呢
如果在同一時間下
1我要匯款會先取讀我現在有多少錢,並扣款變60,再匯出。
2問題來了,我同時存款20,我應該要讀到60元才是正確的,但因為同時間做,所以電腦讀到了80元,再存20,即100元。
如果這世界都這樣,大家都變有錢人了。
如同小刀所說:你的錢就是我的錢,我的錢就是你的錢,發財啦!
這就是一個競時的問題
在微軟的網站上有提出11點競爭問題
http://support.microsoft.com/kb/317723/zh-tw
這裡我只提Database
我們可以使用select … for update的語法來保護自己的交易
START TRANSACTION;
SELECT quantity FROM product WHERE product_id = 5 FOR UPDATE;
UPDATE product SET quantity = quantity - 1 WHERE product_id = 5;
COMMIT;
這裡舉的例子是,每當在交易時,會查尋數量,後再-1更新(實際上的語法會更多,例 大於零才扣庫存等…)
在MYSQL資料庫,只有Storage Engine 是 InnoDB 的情形下才有作用,且需要等查詢連線COMMIT後才可以做其他動作。
而 PostgreSQL 似乎其他連線還可以執行SELECT查詢。
以上是悲觀鎖定
以前做過樂觀鎖定,但現在CPU Thread 愈來愈多的情形下(不知道是不是這樣,但好像是),好像都無法太樂觀…
常觀測到的結果,都還剩一個品項結果還是多賣了一個。
我們預想的是
如果兩個人同時買一張票或一張票(房)且cpu還是會有處理上的差異(微秒之間)
正常來說
a買一張
b買一張
還剩一張
a先買 扣完 b查不到後,售完。
但往往是這樣
a先買 扣完 b還是查到一張,b再買,因為寫入剩於數質都是0 所以 ab 都買成了…
所以之後會再檢查是否過量count 所有買票的筆數,還是等於開放的筆數…
為什麼!! 可能b寫入太慢,或資料庫動作太慢…
不然也是有檢查,數量小於0,兩張都不成功,反正樂觀鎖定不Work就是了…
(ps:使用機器人狂買所測出的結果,實際上真的還是發生了)
留言