建立表account
create table account(
id int not null auto_increment,
name varchar(255) default null,
balance int default null,
primary key(id)
)engine=innodb default charset=utf8;
insert into account(name,balance)values('lilei',450);
insert into account(name,balance)values('hanmei',16000);
insert into account(name,balance)values('lucy',2400);
開啟事務
分別開啟兩個mysql命令列視窗
//該視窗開啟事務
begin;
update account set balance=3000 where id=3;
//視窗2
update account set balance=3100 where id=3;
inndb預設開啟行級鎖,可以發現在視窗一未提交事務時,視窗二不會執行,因為id=3這一行已經被鎖住
但如果視窗二操作其他行是可以執行成功的。
acid
兩個事務同時運算元據庫的相同資料,後提交的事務會覆蓋先提交的事務處理結果,通過樂觀鎖可以解決。
(如前面的鎖演示相同)
事務a讀取到事務b已經修改但尚未提交的事務,如果事務b回滾,則a讀到的資料無效,為臟資料,不符合一致性。
事務a讀到了事務b已經提交的修改資料,不符合隔離性
例如:有兩個事務操作同一賬戶,a事務讀取到賬戶餘額100,b事務在之後修改了賬戶餘額為50並提交了事務,a事務再去讀取發現餘額為50,乙個事務範圍內兩個相同的查詢卻返回了不同資料,這就是不可重複讀。
事務a讀取到了事務b提交的新增資料,不符合隔離性
例如:兩個事務操作同一張表,a事務第一次查詢結果為10條記錄,b事務再之後增加了10條記錄並提交,a事務再次查詢時發現結果為20條記錄,出現了不一致,這就是幻讀。
檢視資料庫事務隔離級別:show variables like 'tx_isolation';
設定事務隔離級別:set tx_isolation='repeatable-read'
隔離級別
髒讀不可重複讀
幻讀讀未提交(read-uncommitted)
可能可能
可能讀已提交(read-committed)
不可能可能
可能可重複讀(repeatable-read)
(mysql預設)
不可能不可能
可能可序列化(serializable)
不可能不可能
不可能演示read-uncommitted
可以發現在第二個事務查詢時,第乙個事務未提交的髒資料給第二個事務讀到了,之後第乙個事務回滾了事務,這時第二個事務讀取到的就是髒資料。
演示:不可重複讀
第乙個事務第一次查詢結果為460,第二個事務修改為400並提交,第乙個事務再讀發現結果為400,兩次同樣的查詢語句結果卻不同,這就是不可重複讀,這會引起程式出現問題
演示:幻讀
不可重複讀已經解決
當balance-50後會直接變為300(如下圖),這就是mvcc機制,即,再repeatable-read隔離級別下,多次讀,後面讀出來的資料永遠和第一次讀出來的資料相同,讀取的是快照中的值。而修改資料則是修改資料庫的數值。
演示:幻讀
當第乙個事務更新第二個事務新新增的資料後再次查詢卻不是第一次查詢的內容了,出現了幻讀。
開啟兩個事務,第乙個事務修改第一行,第二個事務修改第二行,然後第乙個事務再修改第二行,第二個事務修改第一行,於是發生了死鎖。
資料庫事務隔離級別與鎖
四,隔離級別對併發的控制 下表是各隔離級別對各種異常的控制能力。lu丟失更新 dr髒讀 nrr非重複讀 slu二類丟失更新 pr幻像讀 未提交讀 ruyy yyy提交讀 rcnn yyy可重複讀 rrnn nny序列讀 snn nnn 順便舉一小例。ms sql 事務一 set transactio...
資料庫事務隔離級別與鎖
四,隔離級別對併發的控制 下表是各隔離級別對各種異常的控制能力。lu丟失更新 dr髒讀 nrr非重複讀 slu二類丟失更新 pr幻像讀 未提交讀 ruyy yyy提交讀 rcnn yyy可重複讀 rrnn nny序列讀 snn nnn 順便舉一小例。ms sql 事務一 set transactio...
資料庫事務和事務隔離級別
事務的定義很簡單,就是一組操作,這些操作要麼都執行,要麼都不執行,這一組操作是不可分割的.在資料庫中,事務具有acid特性.也就是原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 原子性是指事務是乙個不可分割的一組操作,要麼都發生,...