在做專案中的資料統計分析的時候,需要對訪問量進行統計,對某個欄位的累加,mysql處理累加的時候一般是先查詢後加1,這樣在大訪問量的時候對於select與update的時候會出現資料的不準確性:
偽**如下
$data = select num from test where id=1;
update test set num = $data['num']+1 where id=1;
處理該問題要掌握的幾個概念
共享鎖:讀的時候不能寫---s鎖
排他鎖:寫的時候不能讀---x鎖
快照讀:讀取歷史可見版本,不加鎖,其他事務可修改該記錄
當前讀:最新版本資料,並給該記錄加鎖,保證其他事物不會修改該記錄
髒讀:乙個事務讀取到另乙個事務中未提交的資料,這個事務回滾,形成髒讀
幻讀:事務a讀再次,一次事務b未提交,一次提交,形成幻讀
解決方法:
1、加事務,mysql的事務隔離
2、加鎖
偽**如下:
start transaction;
$data = select num from test where id=1 for update;
update test set num = $data['num']+1 where id=1;
commit;
解釋:mysql的select屬於快照讀,加上for update後讀取的資料屬於當前讀,從而解決mysql update的併發控制
mysql 併發控制 mysql併發控制
mysql併發控制 當有多個查詢需要同時修改同乙個資料,就會產生併發控制的問題。mysql可以在兩個層面進行併發控制 伺服器層和儲存引擎層。mysql通過加鎖實現併發控制 鎖有兩類 讀鎖 共享鎖,即乙個讀鎖不會阻塞其它讀鎖,多個使用者可同時讀取同乙個資源,而不互相干擾。寫鎖 排他鎖,即乙個寫鎖會阻塞...
mysql 併發控制
1 多個執行緒同時修改資料,存在資料不一致的情況,也就是併發控制的問題。2 mysql提供讀鎖和寫鎖,讀鎖之上可以再加讀鎖,不能加寫鎖,而寫鎖之上不能加任何鎖。也就是說,讀鎖是共享的,寫鎖是排他的。3 鎖粒度,為了更好的併發控制,鎖的粒度應該盡可能小,也就是只鎖定修改的資料。但是,鎖本身也有一定的開...
mysql併發控制
mysql併發控制 當有多個查詢需要同時修改同乙個資料,就會產生併發控制的問題。mysql可以在兩個層面進行併發控制 伺服器層和儲存引擎層。mysql通過加鎖實現併發控制 鎖有兩類 讀鎖 共享鎖,即乙個讀鎖不會阻塞其它讀鎖,多個使用者可同時讀取同乙個資源,而不互相干擾。寫鎖 排他鎖,即乙個寫鎖會阻塞...