MySQL多事務併發控制

2021-08-14 04:16:29 字數 1119 閱讀 5834

mysql的預設隔離級別是可重複讀。

若兩個事務a和b操作同一資源,a和b都通過begin開啟事務後,若a只存在讀操作,則b可以對資料進行寫操作,且b的寫操作不會影響a的讀,即a每次讀到的內容都是一致的(就算b已經提交)。

若a進行了寫操作,則b的讀操作不受影響,但b的寫操作會被阻塞,直到a提交了事務或者到達超時時間。值得注意的是,b可以對另外的行進行寫操作,即如果a更改了第一行資料,那b改第一行會被阻塞,但改第二行沒事。因為mysql的預設引擎innodb上的是「行鎖」。

不同的資料庫,不同的資料庫引擎,處理方式都是不一樣的。比如有的資料庫、資料庫引擎更新表的一條記錄的時候上的是表鎖,比如mysql的sam,有的則是鎖行,比如oracle、mysql的innodb。

此時有可能發生死鎖,比如a更改資料1和2,b更改資料2和1。不過這麼做mysql直接報死鎖的錯誤了。

值得注意的是根據不同索引更新資料,mysql可能上不同的鎖!

比如id是主鍵,而user_name是使用者名稱,也是唯一索引,更新使用者的生日,可以使用以下兩條sql中的任意一條:

update t_user set birthday=# where id=#;

update t_user set birthday=# where user_name=#;

但是優選使用主鍵更新,因為mysql執行過程中,第二句sql會鎖表,即不僅僅鎖定更新的資料,而且鎖定表其他的資料,從而影響併發,而使用主鍵的更新則是鎖行。

另外提一點sql的優化細節,比如可以使用連線查詢代替子查詢。

查詢乙個沒有分配角色的使用者id,可以這樣寫:

select u.id from t_user u 

where u.id not in (select ur.user_id from t_user_role ur);

這是乙個not in 語句,效能低下,應該修改為連線語句,從而極大提高sql效能,比如這條語句可以修改為:

select u.id from t_user u left join t_user_role ur

on u.id=ur.user_id

where ur.user_id is null;

mysql 多事務 MySQL多事務併發控制

mysql的預設隔離級別是可重複讀。若兩個事務a和b操作同一資源,a和b都通過begin開啟事務後,若a只存在讀操作,則b可以對資料進行寫操作,且b的寫操作不會影響a的讀,即a每次讀到的內容都是一致的 就算b已經提交 若a進行了寫操作,則b的讀操作不受影響,但b的寫操作會被阻塞,直到a提交了事務或者...

mysql 併發控制及事務

實現的併發訪問的控制技術是基於鎖 鎖分為表級鎖和行級鎖,myisam儲存引擎不支援行級鎖 innodb支援表級鎖和行級鎖 鎖的分類有讀鎖和寫鎖,讀鎖也被稱為共享鎖,加讀鎖的時候其他的人可以讀 寫鎖也稱為獨佔鎖或排它鎖,乙個寫鎖會阻塞其他讀操作和寫操作 鎖還分為隱式鎖和顯式鎖,隱式鎖由儲存引擎自行管理...

事務併發 併發控制(加鎖)

事務處理中的併發控制 1.併發操作 資料庫是乙個共享資源,允許多個使用者程式並行地訪問資料庫,所以當多個使用者併發地訪問同一資料,就可能出現資料的不一致性。例如 假設有兩個事務 t1 和 t2 它們都需要讀出並修改資料 a 其執 況如下所示 執行順序 1 2 3 4 5 6 事務t1 讀aa a 1...