1.髒讀(乙個事務,讀到另外一條未提交事務的資料)read uncommitted出現
2.不可重複讀(乙個事務多次讀取到的資料不一致)read committed出現
3.幻讀(事務ab,事務a插入一條資料,事務b修改所有的資料,發現修改的行數比之前多,好像產生了幻覺一樣)
用一張表account來演示,表字段只包括自增主鍵、name、money三個字段。並且有三條資料。
create
table account(
id int(11
)primary
keyauto_increment
, name varchar(30
)not
null
, money int(11
)not
null);
insert
into account(name, money)
values
('zhangsan'
,1000);
insert
into account(name, money)
values
('liuneng'
,1000);
insert
into account(name, money)
values
('zhaosi'
,1000
);
下面會多次用到查詢事務隔離級別的命令,在此先列出查詢事務隔離級別的命令:
select @@tx_isolation
;
設定事務隔離級別為read uncommitted(讀未提交)
set
session
transaction
isolation
level
read
uncommitted
;
1.開啟乙個事務,並且修改id為1的money值-100
start
transaction
;update account set money = money -
100where id =
1;
2.開啟另外事務,查詢表
已經表明能夠讀到另外乙個事務未提交的資料了。我們在第二個事務給money+200,並且提交
update account set money = money +
200where id =1;
commit
;
3.此時讓第乙個session回滾事務,我們再次查詢表
理論上我們第一次是無效的,所以本來1000加上200後是1200,但是因為髒讀,第二個事務是讀到了第乙個事務未提交的資料上做的修改導致出問題。
避免髒讀:設定事務隔離級別為read committed(讀已提交)
設定事務隔離級別為read committed(讀已提交)
set
session
transaction
isolation
level
read
committed
;
原始資料:
1.開啟乙個事務,並且先查詢一下id為1的money
start
transaction
;select
*from account where id =
1;
2.開啟另外乙個事務,給id為1的money+300,並提交
start
transaction
;update account set money = money +
300where id =1;
commit
;
3.第乙個事務再查資料
此時,第乙個事務提交。
提交後查詢表,發現第乙個事務明明什麼都沒做,結果資料+300,此時如果事務一對資料修改,則會產生問題。
避免不可重複讀:設定事務隔離級別為repeatable read(可重複讀)
設定事務隔離級別為repeatable read(可重複讀)
set
session
transaction
isolation
level
repeatable
read
;
原始資料:
1.同時開啟兩個事務ab
start
transaction
;
2.事務b插入一條資料,並且提交
insert
into account(name, money)
values
('zhaoguangkun'
,500);
commit
;
3.事務a修改所有的資料的money為2000,並且提交
update account set money =
2000
;commit
;
對於事務a來說,本來是有3行資料的,修改所有的money後,竟然影響了4行,我們再來看看資料庫:
幻讀是好像出現了幻覺一樣,幻讀一般產生在插入/刪除資料。
避免幻讀:設定事務隔離級別為serializable(序列)
MySQL資料庫InnoDB與MyISAM區別
特點 行級鎖,支援事務處理,支援外來鍵,行鎖實現,根據索引條件檢索資料使用行鎖。表鎖,支援全文索引。表鎖,分為表共享鎖和表獨佔鎖。讀和讀之間使用共享鎖,讀寫之間使用獨佔鎖。b樹,又稱多路平衡查詢樹。所有節點中孩子節點的最大值為此樹的階 用m表示 每個節點關鍵字的個數最少有 m 2 1 個,最多有 m...
Mysql資料庫索引原理 InnoDB索引實現
innodb使用b tree作為索引結構 例如有這麼乙個表資料 col1為主鍵 在innodb中,表資料檔案本身就是按b tree組織的乙個索引結構,這棵樹的葉結點data域儲存了完整的資料記錄。這個索引的key是資料表的主鍵,因此innodb表資料檔案本身就是主索引。圖1圖1是innodb資料檔案...
關於MySql 資料庫InnoDB儲存引擎介紹
熟悉mysql的人,都知道innodb儲存引擎,如大家所知,redo log是innodb的核心事務日誌之一,innodb寫入redo log後就會提交事務,而非寫入到datafile。之後innodb再非同步地將新事務的資料非同步地寫入datafile,真正儲存起來。那麼innodb引擎有了red...