SQL1:select * from test where id = 1 SQL2:update test set name='newname' where id = 1
原理數據庫
操做一在進行數據庫讀操做時,不對數據庫上任何鎖;spa
操做二在進行更新操做時,對數據加行級共享鎖。code
現象:blog
事務1 | 事務2 |
select * from test where id = 1 |
|
update test set name='newname' where id = 1 |
|
select * from test where id = 1 |
|
rollback |
事務一共查詢了兩次,兩次查詢結果不同。在兩次查詢的過程當中,事務二對數據進行了修改,並未提交(commit)。可是事務一的第二次查詢查到了事務二的修改結果。在數據庫的讀現象淺析中咱們介紹過,這種現象咱們稱之爲髒讀。事務
原理get
SQL1在讀數據時加行級共享鎖,讀完該行當即釋放;it
SQL2在更新數據時加行級排他鎖。只有在更新操做提交之後才容許其餘操做,事務完成後釋放table
現象class
SQL1進行兩次讀操做,在第一次讀操做後,SQL2開始執行並對該數據加排他鎖,SQL1只能等到SQL2執行完畢後執行第二次讀操做。讀已提交會致使兩次讀取的結果不一致,也就是不可重複讀現象。test
事務1:select * from test where age between 10 and 21;
事務2:insert into test values(1,'newname',20);
原理
SQL1進行讀操做時,對操做數據加行級共享鎖,直到事務結束才釋放;
更新操做添加行級排他鎖,更新後釋放。
現象
只有事務一結束,事務2才能夠執行,因此能夠解決不可重複讀的問題;
如果SQL2是插入語句,因爲事務1對數據加的是行級共享鎖,沒有對整表加鎖,因此SQL2能夠執行。這樣兩次SQL1的結果不一致,致使幻讀。
原理
讀寫都加表級排他鎖