mysql 併發控制

2022-09-12 20:45:26 字數 809 閱讀 7684

在做專案中的資料統計分析的時候,需要對訪問量進行統計,對某個欄位的累加,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通過加鎖實現併發控制 鎖有兩類 讀鎖 共享鎖,即乙個讀鎖不會阻塞其它讀鎖,多個使用者可同時讀取同乙個資源,而不互相干擾。寫鎖 排他鎖,即乙個寫鎖會阻塞...