原子性:強調事務的不可分割
一致性:強調的是事務的執行的先後,數據的完整性要保持一致
隔離性:一個事務的執行不該該受到其餘事務的干擾
持久性:事務一旦結束(提交/回滾)數據就持久保持到了數據庫數據庫
讀問題
髒讀:一個事務讀到另外一個事務尚未提交的數據
不可重複讀:一個事務讀到了另外一個事務已經提交的update數據,致使在當前的事務中屢次查詢數據不一致
虛讀/幻讀:一個事務讀到另外一個事務已經insert數據,致使當前事務中屢次查詢結果不一致安全
寫問題
引起兩類丟失更新session
設置事務的隔離級別
read uncommitted :未提交讀。髒讀,不可重複讀,虛讀均可能發生
read committed :已提交讀。避免髒讀,不可重複讀和虛度有可能發生
repeatable read :可重複讀。避免髒讀和不可重複讀,虛讀可能發生
serializable :串行化的。避免髒讀,不可重複讀,虛讀的發生spa
select @@tx_isolation; 查看隔離級別
set session transaction isolation level 級別; 設置隔離級別事務
演示髒讀
1.分別開啓兩個dos窗口 A.B
2.先查看兩個窗口的隔離級別 select @@tx_isolation;
3.設置A窗口的隔離級別爲未提交讀 it
set session transaction isolation level read uncommitted;io
4.分別在兩個窗口開啓事務table
start transaction;date
5.分別開啓兩個dos窗口 A.Bselect
update account set money = money - 1000 where name = '張森';
update account set money = money + 1000 where name = '鳳姐';
6.在A窗口查詢數據
select * from account; -- A事務讀到了B事務尚未提交的數據;
演示避免髒讀,演示不可重複讀發送
1.分別開兩個窗口,A.B
2.設置A窗口的隔離級別:read committed
set session transaction isolation level read committed;
3.分別在兩個窗口開啓事務 start transaction;
4.在B窗口完成轉帳
update account set money = money - 1000 where name = '張森';
update account set money = money + 1000 where name = '鳳姐';
5.在A窗口進行查詢
select * from account; -- 避免髒讀
6.在B窗口提交事務
commit;
7.在A窗口中再次查詢
select * from account; 轉帳成功.(不可重複讀:一個事務讀到另外一個事務中已經提交的update的數據,致使屢次查詢結果不一致.)
避免髒讀和不可重複讀,演示虛讀
1.分別開啓兩個窗口,A.B
2.設置A窗口的隔離級別:
repeatable read
set session transaction isolation level repeatable read;
3.分別在兩個窗口中開啓事務
start transaction;
4.在B窗口完成轉帳的操做
update account set money = money - 1000 where name = '張森';
update account set money = money + 1000 where name = '鳳姐';
5.在A窗口查詢
select * from account; -- 轉帳沒有成功:避免髒讀.
6.在B窗口提交事務
commit;
7.在A窗口再次查詢
select * from account; -- 轉帳沒有成功:避免不可重複讀.
避免虛讀
1.分別開啓兩個窗口,A.B
2.設置A窗口的隔離級別:repeatable read
set session transaction isolation level repeatable read;
3.分別在兩個窗口中開啓事務
start transaction;
4.在B窗口完成插入操做
insert into account values (null,'王老師',10000)
5.在A中進行查詢操做
select * from account; -- 沒有查詢到任何結果
6.在B窗口提交事務
commit; -- A窗口立刻就會顯示數據